Fcron, eine flexible Cron-Alternative

Orlando Rosu, 123RF

Flexible Zeitsteuerung für allerhand Admin-Jobs: Fcron beherrscht alles, was der klassische Cron-Daemon kann, und bietet dazu noch einige nützliche Extras .

Für Admins und andere Linux-Anwender ist der Cron-Daemon ein alter Bekannter. Der Scheduler führt regelmäßig in Textdateien konfigurierte Aufgaben aus. Die meisten Cron-Implementierungen wie Vixie Cron, ISC Cron, BCron und DCron gehen allerdings von einem System aus, das ohne Unterbrechungen alle 7 Wochentage 24 Stunden läuft.

Das trifft allerdings nur auf Server zu – Laptops werden sehr oft heruntergefahren oder in den Suspend-Modus versetzt. Desktop-Rechner sind in der Regel nachts oder an Urlaubstagen ausgeschaltet, um Energie zu sparen. Bei solchen Einsatzszenarien bleiben Cronjobs unerledigt, wenn der Computer zur fraglichen Zeit nicht lief.

Abhilfe für dieses Problem schafft die Cron-Alternative Anacron. Anacron verwendet einen Liste von Aufgaben, die innerhalb einer bestimmten Zeit erledigt sein müssen. Wenn das Programm startet, prüft es, welche Jobs noch nicht erledigt sind und führt diese aus.

Anacron hat aber auch Nachteile: Da das Programm nicht als Daemon läuft, muss es bei Bedarf gestartet werden, entweder manuell, durch Boot-Skripte oder durch Cron. Außerdem ist Anacron nicht für Zeiteinheiten gedacht, die kürzer als ein Tag sind. Diese beiden Probleme können in Kombination dazu führen, dass Cron und Anacron gleichzeitig laufen, aber eine Aufgabe zwei Mal oder gar nicht erledigt wird.

Die GPL-Software Fcron dagegen beherrscht alles, was der klassische Vixie-Cron und Anacron bieten, und noch einiges darüber hinaus.

Fcron ist in den Repositories der meisten Linux-Distributionen als Paket enthalten und lässt sich mit dem Paketmanager installieren.

Fcron-Konfigurationsdateien

Die Konfigurationsdateien für Fcron ähneln denen für den Vixie-Cron, der bei den meisten Distributionen standardmäßig installiert ist. In der Regel befinden sich die folgenden Dateien in “/etc/fcron”:

  • “fcron.conf” nimmt Einstellungen wie den gewünschten Texteditor und den verwendeten Mailer auf.
  • “fcron.allow” verzeichnet, welche Benutzer Fcron verwenden dürfen. Dabei bedeutet die Einstellung “all”, dass alle User eine eigene Fcrontab-Datei einsetzen dürfen.
  • “fcron.deny” definiert jene Benutzer, die Fcron nicht verwenden dürfen. Dabei überstimmen die Deny-Einstellungen jene aus “fcron.allow”.

Die mitgelieferten Standardeinstellungen dürften für die meisten Anwendungsfälle geeignet sein, es sei denn, strengere Beschränkungen sind erwünscht.

Neben den geplanten Aufgaben kann die Fcrontab-Datei noch Umgebungsvariablen wie “HOME” und “SHELL” enthalten. So lässt sich zum Beispiel die Standardshell aus “/etc/passwd” mit der folgenden Angabe überschreiben:

SHELL=/bin/sh

Crontab-Dateien bearbeiten

Der folgende Befehl öffnet die Fcrontab-Datei des aktuellen Benutzers im Default-Editor:

fcrontab -e

Um die systemweite Fcrontab zu bearbeiten, führt man als Root folgende Zeile aus:

fcrontab -e systab

Wer Fcrons zusätzliche Features nutzen möchte, muss eine erweiterte Syntax verwenden, die sich von den klassischen Crontab-Dateien unterscheidet.

Cronjobs mit fester Datums- und Zeitangabe

Die folgende Aufgabe ließe sich mit jeder Cron-Implementierung lösen: An allen Werktagen soll der Job um 3 Uhr nachts eine Datei auf ein Backup-Medium kopieren:

& 00 03 * * mon-fri cp ~/Documents/Important.odt /mnt/backup/Important.odt~

Wen man den Editor beendet, speichert Fcron diese Angaben. Zuvor aber prüft das Programm die Eingaben auf korrekte Syntax und verlangt gegebenenfalls Ausbesserungen.

Das “&” am Zeilenanfang teilt Fcron mit, dass der Job eine feste Datums- und Zeitangabe besitzt. Darauf folgen zwei Felder für die Uhrzeit (Minuten, Stunden) und drei für das Datum (Kalendertag, Monat und Wochentag). Die Zeitangabe im obigen Beispiel lautet also: “um 00 Minuten, 03 Stunden, jeden Kalendertag des Monats, jeden Monat, von Montag bis Freitag”. Am Ende der Zeile steht das auszuführende Kommando.

Beim Anlegen von Cronjobs mit fester Zeitangabe sind alle von Datums- und Zeitfelder auszufüllen. Dabei kommt der Asterisk “*” zum Einsatz, wenn es in einem Feld keine Einschränkung gibt, also beispielsweise alle Monate gemeint sind.

Monate und Wochentage lassen sich sowohl als Zahlen (“0” und “7” bezeichnen beide den Sonntag) oder lesefreundlicher als Abkürzungen der englischen Namen mit drei Buchstaben (“mon”, “tue”, “wed”, …) angeben. Dabei sind auch mit Kommata getrennte Listen möglich sowie Bereiche (“mon-fri”). Regelmäßige Sprünge innerhalb eines Bereichs bezeichnet dein vorangestellter Schrägstrich “/”, und die Tilde “~” markiert Ausnahmen innerhalb eines Bereichs. Die folgenden Beispiele illustrieren diese Schreibweisen.

Das folgende Beispiel nervt den Anwender mit einer kleinen Benachrichtigung, und zwar alle 20 Minuten, von 9 bis 16 Uhr vom 10. bis 25. März – ausgenommen den 15. März, weil er an diesem Tag Urlaub hat:

& 00,20,40 9-16 10-25~15 mar * echo "Na, schon fertig?"

Ein weiteres Beispiel: Die folgende Zeile führt jeden zweiten Tag um 16 Uhr ein Skript im Home-Verzeichnis des Anwenders aus und mailt dessen Ausgabe an den Chef.

&mailto(boss@example.com) * * */2 * * ~/script.sh

Die obige Zeile demonstriert mit “mailto()” auch eine weitere Option für Fcron-Jobs. Mehr dazu folgt gegen Ende dieses Artikels.

Der Einsatz von Zeiträumen

Was dieser Artikel bis jetzt von Fcron gezeigt hat, dürfte freilich kaum jemanden zum Umstieg bewegen, denn es entspricht dem klassischen Cron-Verhalten. Doch jetzt wird es spannend: Kaum ein Rechner, außer Servern, dürft ununterbrochen laufen. Das führt beim klassischen Cron zu ausgelassenen Jobs. Fcron kann das besser.

Die Cron-Alternative kann auch mit definierten Zeiträumen umgehen. Läuft das System innerhalb des angegebenen Zeitraums, wird der Job ausgeführt. Dieses Fcron-Feature macht sich vor allem auf Laptops gut, wie das folgende Listing zeigt:

%daily,nice(7) * 10-14 makewhatis -u
%daily,nice(7) 30 16-18 updatedb

Diese Zeilen stammen aus der System-Fcrontab des Autors. Das “%” am Zeilenanfang signalisiert Fcron, dass nun ein Zeitraum folgt. Das folgende Schlüsselwort beschreibt die Art des Zeitraums. Hier können die Angaben “hourly”, “daily”, “weekly” und “monthly” stehen, auch Zeiteinheiten sind hier zulässig, beispielsweise “mins”, “hours”, “days”, “dow” [day of the week, Wochentag] oder “mons”. Die Schlüsselwörter mit der Endung “-ly” sind leicht zu merken: “daily” etwa führt einen Job täglich einmal aus, “weekly” startet ihn einmal irgendwann zwischen Montag und Sonntag und wartet anschließend, bis die nächste Woche beginnt.

Nach dem Komma ist eine weitere Option zu sehen: “nice()”. Wie der Name andeutet, sorgt sie dafür, dass der Job mit dem in Klammern angegebenen Nice-Wert läuft. Danach folgen die Angaben für den Zeitraum sowie das Kommando.

Was machen die obigen Fcron-Jobs? Der erste aktualisiert die Manpages mit dem Kommando “makewhatis -u”, und zwar täglich irgendwann zwischen 10 und 14 Uhr. Die zweite Zeile aktualisiert die (S)locate-Datenbank mit “updatedb”, falls der Rechner irgendwann zwischen 16:30 oder 18:30 läuft.

Das Beispiel verwendet das Schlüsselwort “daily”, das einen in Minuten und Stunden definierten Zeitraum erwartet. Das gleiche gilt für “weekly”, “hourly” benötigt nur das Feld für die Minuten, und “monthly” erwartet Minuten, Stunden und Tage.

Tritt nun auch noch die Vorsilbe “mid” vor eines dieser Schlüsselwörter, etwa in “middaily” oder “midweekly”, beginnt und endet der Zeitraum in der Mitte der angegebenen Zeiteinheit. Für “midweekly” zum Beispiel bedeutet das, dass das Kommando irgendwann zwischen Donnerstag dieser Woche und Mittwoch nächster Woche zur Ausführung kommt.

Weitere Feinheiten der Konfiguration veranschaulicht der folgenden Job:

%hours 20,40 9-10 * * * finger boss

Er läuft jeden Tag nur einmal, und zwar entweder um 9:20, 9:40, 10:20 oder 10:40 Uhr. Steht am Zeilenanfang nämlich “hours” oder ein anderes Keyword mit “s” am Ende, ignoriert Fcron normalerweise zwar alle Felder die kleiner als das Keyword sind. Ist jedoch ein solches Feld gesetzt (ein “*”zählt nicht), berücksichtigt Fcron diese Angabe und verwendet sie als möglichen Ausführungszeitpunkt.

Würde im obigen Beispiel dagegen zu Beginn “mins” stehen, würde das Finger-Kommando jeden Tag vier Mal ausgeführt, nämlich um 9:20, 9:40, 10:20 und 10:40 Uhr. Der Grund: In diesem Fall wären die Minuten Teil des Zeitraums.

Im Allgemeinen liefern die auf “s” endenden Schlüsselworte Einstellungsmöglichkeiten, die zwischen einem festen Termin und den Keywords mit -“ly” rangieren.

Wenn die Uptime zählt

Wäre es nicht schön, die Ausführung von Kommandos von der Uptime abhängig zu machen? Dazu könnte man bestimmt ein kompliziertes Skript mit Loop und Sleep-Funktion schreiben, es geht aber auch viel einfacher: Fcron kann Jobs in Abhängigkeit von der Uptime ausführen – genauer: abhängig von der Uptime seit dem Start des Fcron-Daemons.

Um einen Bericht zu erzeugen, der alle 15 Minuten mit den Kommando “w” die Systemlast und die eingeloggten User auflistet, lässt sich beispielsweise folgenden Zeile verwenden:

@ 15 w > /root/user_stats

Das “@” am Zeilenanfang markiert den Job als abhängig von der Uptime. Danach folgt die Zeitangabe für den Rhythmus der Ausführung, in diesem Fall alle 15 Minuten, gefolgt von der auszuführenden Befehlszeile.

Nehmen wir an, der Admin möchte es erfahren, wenn ein Rechner die stolze Uptime von einem Jahr überschreitet. Das kann er mit folgender Zeile erledigen:

@mail 365d echo "Hurra, die Kiste ist ein Jahr älter :D"

Die Angabe “mail” schickt eine Nachricht an den Eigentümer der Fcrontab – im Unterschied zur Option “mailto()”, die eine E-Mail-Adresse als Argument entgegennimmt. Das Feld für den Ausführungsrhythmus ist mit “365d”, also 365 Tagen befüllt. An dieser Stelle lassen sich verschiedene Zeiteinheiten einsetzen, nämlich “s” für Sekunden, “h” für Stunden, “d” für Tage, “w” für Wochen und “m” für Monate. Achtung: Für Minuten wird keine Einheit angegeben. Diese Einheiten lassen sich sogar kombinieren, wie in folgendem Beispiel:

@ 2w3d10h15 sh /root/script.sh

Dieser Eintrag sorgt dafür, dass ein Skript immer nach zwei Wochen, drei Tagen, zehn Stunden und 15 Minuten ausgeführt wird.

Weitere Optionen

Optionen für Fcron lassen sich global oder zu Beginn einer einzelnen Crontab-Zeile angeben. Steht eine Option allein für sich in einer Zeile, muss ihr ein “!” vorangehen (ohne Leerzeichen dazwischen). In normalen Cronjob-Zeilen folgen Optionen direkt nach “@” oder “&”. Im Fall von “%”-Zeilen folgen Optionen nach dem Schlüsselwort, durch ein Komma abgetrennt. Zwischen mehreren Optionen stehen ebenfalls Kommata.

Optionen, die innerhalb eines einzelnen Cronjobs stehen, überschreiben stets die globalen Einstellungen. Es lassen sich allerdings nicht alle Optionen gleichermaßen auf alle Arten von Jobs anwenden.

Ein weiteres Beispiel:

&bootrun(true),nice(8) 30 3 * * * python /root/admin_report.py

Dieser Job stößt täglich um 3:30 Uhr ein Python-Skript an. Die Angabe “nice(8)” sorgt für das gewünschte Nice-Level. Die Option “bootrun(true)” veranlasst, dass der der Job außerdem beim Start des Fcron-Daemons zur Ausführung kommt.

Die folgende Zeile konfiguriert drei Skripte, die stündlich laufen sollen.

@first(5) 1h sh one_script.sh
@first(10) 1h sh another_script.sh
@first(20) 1h sh yet_another_script.sh

Ohne die Option “first()” würden alle drei Jobs versuchen, gleichzeitig zu laufen. Die Argumente zu “first()” sorgen jedoch dafür, dass die Skripte zu unterschiedlichen Zeiten angestoßen werden: Das erste 5 Minuten nach jeder Stunde Uptime, das zweite 10 Minuten nach jeder Stunde und das dritte 20 Minuten nach jeder Stunde.

Eine interessante Option ist außerdem “random”:

%daily,random,mailto(tux) * 8-20 ping example.com

Sie veranlasst Fcron, einen Job zu einem zufälligen Zeitpunkt innerhalb des angegebenen Zeitraums zu starten. Standardmäßig würde die Aufgabe zum frühestmöglichen Zeitpunkt abgearbeitet.

Wie man sieht, kann Fcron alles was der Admin von Cron und Anacron gewöhnt ist. Daneben bietet er weitere Einstellungsmöglichkeiten und kann beispielsweise besser mit Downtimes umgehen. Weitere Informationen zur Arbeit mit Fcron gibt es in der Online-Dokumentation auf der Projektseite. (mhu)

Der Autor

Matija Šuklje studiert Jura und interessiert sich sehr für Freie/Opensource-Software und Urheberrecht. Seit mehr als einem Jahrzehnt ist er GNU/Linux-Anwender. Auf seiner Homepage schreibt er über Software, Recht und Tee.

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben