<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Tools on 0xMax42 - Flatfile-Purist. Autodidakt. Systemdenker.</title><link>https://0xMax42.io/categories/tools/</link><description>Recent content in Tools on 0xMax42 - Flatfile-Purist. Autodidakt. Systemdenker.</description><generator>Hugo -- gohugo.io</generator><language>de-de</language><lastBuildDate>Sat, 24 May 2025 21:30:00 +0000</lastBuildDate><atom:link href="https://0xMax42.io/categories/tools/index.xml" rel="self" type="application/rss+xml"/><item><title>Systemd-Timer per CLI erstellen – einfach, schnell, nervenschonend</title><link>https://0xMax42.io/p/systemd-timer-per-cli-erstellen-einfach-schnell-nervenschonend/</link><pubDate>Sat, 24 May 2025 21:30:00 +0000</pubDate><guid>https://0xMax42.io/p/systemd-timer-per-cli-erstellen-einfach-schnell-nervenschonend/</guid><description>&lt;img src="https://0xMax42.io/p/systemd-timer-per-cli-erstellen-einfach-schnell-nervenschonend/systemd-timer-cover.webp" alt="Featured image of post Systemd-Timer per CLI erstellen – einfach, schnell, nervenschonend" /&gt;&lt;p&gt;Wer schon mal versucht hat, systemd-Timer von Hand zu schreiben, weiß: So richtig Spaß macht das nicht. Zwischen &lt;code&gt;.service&lt;/code&gt;- und &lt;code&gt;.timer&lt;/code&gt;-Dateien, Pfadangaben, und &lt;code&gt;OnCalendar&lt;/code&gt;-Syntax kann man sich schnell vertun. Genau dafür habe ich mir ein kleines Tool gebaut: &lt;code&gt;systemd-timer&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="was-macht-das-ding"&gt;Was macht das Ding?
&lt;/h2&gt;&lt;p&gt;Ganz einfach: Du rufst ein CLI auf, gibst ein paar Parameter an, und das Tool schreibt dir die passenden &lt;code&gt;.service&lt;/code&gt;- und &lt;code&gt;.timer&lt;/code&gt;-Units – inklusive Logging, Abhängigkeiten und allem, was systemd eben braucht. Keine Vorlage kopieren, keine Tippfehler mehr, kein Nachdenken darüber, ob das jetzt &lt;code&gt;WantedBy=timers.target&lt;/code&gt; heißen muss oder nicht.&lt;/p&gt;
&lt;h2 id="warum-nicht-einfach-cron"&gt;Warum nicht einfach &lt;code&gt;cron&lt;/code&gt;?
&lt;/h2&gt;&lt;p&gt;Klar, &lt;code&gt;cron&lt;/code&gt; funktioniert. Aber systemd hat ein paar Vorteile:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Besseres Logging (auch in Datei)&lt;/li&gt;
&lt;li&gt;Einfache Integration mit anderen Diensten (z. B. Netzwerkwarten)&lt;/li&gt;
&lt;li&gt;Funktioniert auch pro Benutzer (ohne root-Rechte)&lt;/li&gt;
&lt;li&gt;Alles bleibt in einer Sprache: systemd&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Das CLI hilft dabei, die Einstiegshürde zu senken und trotzdem &amp;ldquo;richtig&amp;rdquo; mit systemd zu arbeiten.&lt;/p&gt;
&lt;h2 id="was-kann-systemd-timer"&gt;Was kann &lt;code&gt;systemd-timer&lt;/code&gt;?
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.service&lt;/code&gt; + &lt;code&gt;.timer&lt;/code&gt;-Dateien erstellen&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--user&lt;/code&gt;-Timer (für Desktop- oder Container-Umgebungen)&lt;/li&gt;
&lt;li&gt;Logging per &lt;code&gt;--logfile&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Standard-Optionen wie:
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--exec&lt;/code&gt;, &lt;code&gt;--calendar&lt;/code&gt;, &lt;code&gt;--after&lt;/code&gt;, &lt;code&gt;--environment&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--description&lt;/code&gt;, &lt;code&gt;--output&lt;/code&gt;, &lt;code&gt;--dry-run&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;CLI basiert auf &lt;code&gt;Cliffy&lt;/code&gt;, getippt mit Deno&lt;/li&gt;
&lt;li&gt;Plattformunabhängige Installation per Shell-Skript&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ein-beispiel-das-du-sofort-nutzen-kannst"&gt;Ein Beispiel, das du sofort nutzen kannst
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;span class="lnt"&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemd-timer create &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --exec &lt;span class="s2"&gt;&amp;#34;/usr/local/bin/backup.sh&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --calendar &lt;span class="s2"&gt;&amp;#34;Mon..Fri 02:00&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --description &lt;span class="s2"&gt;&amp;#34;Backup Job&amp;#34;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --user &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; --logfile &lt;span class="s2"&gt;&amp;#34;/var/log/backup.log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Ergebnis:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.config/systemd/user/backup.service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;~/.config/systemd/user/backup.timer&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Aktivieren:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;systemctl --user &lt;span class="nb"&gt;enable&lt;/span&gt; --now backup.timer
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="installation-ein-einzeiler"&gt;Installation: Ein Einzeiler
&lt;/h2&gt;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -fsSL https://git.0xmax42.io/maxp/systemd-timer/raw/branch/main/scripts/install.sh &lt;span class="p"&gt;|&lt;/span&gt; sh
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Das Skript erkennt automatisch deine Architektur (amd64/arm64), lädt die passende Binary und prüft sie mit SHA256. Und ja, du kannst dir den Code vorher anschauen, bevor du ihn durch die Leitung jagst.&lt;/p&gt;
&lt;h2 id="entwicklung--test"&gt;Entwicklung &amp;amp; Test
&lt;/h2&gt;&lt;p&gt;Das Tool ist komplett mit TypeScript/Deno geschrieben, ordentlich typisiert und testgetrieben. Alles Wichtige ist modular aufgebaut, damit man es auch als Bibliothek verwenden könnte.&lt;/p&gt;
&lt;p&gt;Tests laufen einfach per:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;deno task &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id="fazit"&gt;Fazit
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;systemd-timer&lt;/code&gt; ist kein Monster-Tool mit 1000 Optionen – sondern genau das, was man sich wünscht, wenn man öfter mal einfache Tasks zeitgesteuert per systemd laufen lassen will, ohne sich jedes Mal die Finger wundzuschreiben. Es richtet sich an Leute, die lieber deklarativ als improvisiert arbeiten.&lt;/p&gt;
&lt;p&gt;Quellcode, Releases und alles Weitere findest du hier:
👉 &lt;a class="link" href="https://git.0xmax42.io/maxp/systemd-timer" target="_blank" rel="noopener"
&gt;git.0xmax42.io/maxp/systemd-timer&lt;/a&gt;&lt;/p&gt;</description></item></channel></rss>