Die einfachere Alternative zu Cron: Whenjobs

© stillfx, 123RF

Neue Zeit-Rechnung

Cronjobs sind bei der Administration von Linux- und Unix-Systemen unverzichtbar. Allerdings ist die Syntax sehr beschränkt und fehleranfällig. Ein moderner Cron-Ersatz will mit diesen Schwächen aufräumen.
RAID-Technologie verspricht höhere Performance und mehr Sicherheit beim permanenten Speichern von Daten. Die ADMIN-Redaktion gibt einen Überblick über ... (mehr)

Eines der vielen Erbstücke aus den Urzeiten von Unix (seit V7 Unix, um genau zu sein) ist der Cron-Daemon, der auch auf heutigen Linux- und BSD-Systemen regelmäßige Jobs ausführt. Zwar haben sich im Lauf der Zeit einige Alternativen entwickelt, wie etwa Fcron [1] und Anacron[2], doch am Grundprinzip hat sich wenig geändert.

Der Red-Hat-Programmierer Richard W.M. Jones hat nun unter dem Namen "Whenjobs" in Eigenregie eine Cron-Alternative entwickelt, die alte Zöpfe abschneidet. Im Wesentlichen bietet Whenjobs [3] gegenüber Cron zwei Vorteile: eine einfachere Syntax, um Jobs und Ausführungszeitpunkte festzulegen und ein System, das es ermöglicht, Abhängigkeiten zwischen Jobs zu definieren.

Für Fedora 17 gibt es bereits fertige Pakete von Whenjobs, Benutzer anderer Distributionen müssen das Tool selbst übersetzen. Zur Installation können Sie Whenjobs aus dem Git-Repository auschecken. Einfacher ist es allerdings, das neueste Tarfile herunterzuladen, denn so müssen Sie sich wenigstens nicht noch mit Autoconf und Automake herumschlagen. Weil Whenjobs in der funktionalen Programmiersprache Ocaml geschrieben ist, brauchen Sie den entsprechenden Compiler und noch ein paar Pakete, die sich zum Beispiel auf Ubuntu 12.10 mit dem folgenden Befehl installieren lassen:

sudo apt-get install ocaml ocaml-findliblibcalendar-ocaml libcalendar-ocaml-dev camlp4-extra libocamlnet-ocaml-bin

Der Befehl »./configure« startet die Konfiguration, die verrät, ob alle nötigen Pakete installiert sind. Im Test trat bei der darauf folgenden Übersetzung per »make« der Fehler »Error: Unbound value Xdr.safe_add« auf, der sich dadurch beheben ließ, die erzeugten Dateien »lib/whenproto_aux.ml« und »lib/whenproto_aux.mli« zu löschen. Ein Aufruf von »make install« installiert Whenjobs anschließend systemweit.

Mit der Option »--help« gestartet, gibt »whenjobs« einen kurzen Hilfetext aus, der die verfügbaren Optionen und Parameter anzeigt (Abbildung 1). Mit »whenjobs -e« startet das Programm einen Editor, der beim ersten Start schon ein Whenjobs-File enthält, das allerdings nur aus einem Kommentar besteht (Abbildung 2). Wie der Vi-Editor in der Abbildung zeigt, handelt es sich dabei um die Datei ».$HOME/whenjobs/jobs.ml« . Bei Syntax-Fehlern im Jobs-File reagiert Whenjobs recht unwirsch und gibt einfach eine Compiler-Fehlermeldung aus, speichert die Datei aber trotzdem. Statt der einen Datei dürfen auch mehrere Dateien mit der Endung ».ml« in ».whenjobs« abgelegt werden, allerdings muss man sie dann von Hand editieren. Außerdem müssen die Dateinamen den Ocaml-Regeln entsprechen, dürfen also keinen Bindestrich enthalten.

Abbildung 1: Mit --help gestartet zeigt Whenjobs die verfügbaren Aufrufparameter an. Ausführliche Hilfe bietet die Manpage.
Abbildung 2: Beim ersten Start zeigt Whenjobs schon einen Job, der einen kurzen Hilfetext anzeigt.

Die Grundlagen der Whenjobs-Dateien sind in diesem Kommentar erklärt. Kommentare beginnen mit »(*« und enden mit »*)« – was ein dezenter Hinweis darauf ist, dass es sich bei Whenjobs-Files selbst um Ocaml-Dateien handelt – normalerweise muss man sich mit der Programmiersprache aber bei der Whenjobs-Benutzung nicht beschäftigen. Eine Zeitangabe startet mit dem Schlüsselwort »every« und endet mit einem Doppelpunkt, zum Beispiel:

every 10 minutes:

Die Zeichen »<<« leiten daraufhin einen Block mit Shell-Befehlen ein, den die Zeichen »>>« abschließen.

Variabel

Das Beispiel in den Kommentaren illustriert einige Whenjobs-Features, zum Beispiel das Setzen von Variablen. Dazu bietet das Tool die Option »--set« , die sich etwa durch die Angabe des Variablentyps mit »--type« ergänzen lässt. Der folgende Code führt also erst das Stat-Kommando aus und weist dessen Ergebnis der Shell-Variablen »free« zu. Die zweite Zeile liest diese Variable aus und weist sie der Whenjobs-Variablen »free_space« vom Typ Integer zu, die später anderen Jobs zur Verfügung steht.

free=`stat -f -c %b /home`
whenjobs --set --type int free_space=$free

Der untere Code-Abschnitt in Abbildung 1 zeigt, wie man mit Whenjobs abhängig von bestimmten Werten neue Jobs ausführen kann. Die Syntax hierzu lautet:

when Bedingung : Job-Code

Mit der Whenjobs-Funktion »changes« lässt sich beispielsweise überwachen, wann sich eine Variable ändert. Somit lässt sich mit der obigen Variablen die Bedingung formulieren "ändert sich free_space und ist der Wert kleiner als 10000 (Blocks)":

when changes free_space && free_space <100000 :

Damit dies funktioniert, muss der Whenjobs-Daemon »whenjobsd« laufen, der die Variablen speichert und die Jobs ausführt. Er lässt sich mit dem Frontend »whenjobs« und der Option »--daemon-start« starten. Alternativ können Sie auch »whenjobsd« direkt starten und haben dann die Optionen »-f« , die den Start im Hintergrund verhindert, und »-d« , die zusätzlich Debug-Meldungen einschaltet. Mit »whenjobs --variables« gibt das Tool die aktuell gespeicherten Variablen aus.

Soll die Änderung einer Variablen kein Change-Event auslösen, lässt sie sich mit der zusätzlichen Option »--whisper« setzen:

whenjobs --set free_space=0 --whisper

Laufende Jobs zeigt Whenjobs mit »--jobs« an, die geladenen mit »--job-names« . Den Namen können Sie setzen, indem Sie ihn vor die Zeile mit »when« oder »every« platzieren:

job "disk monitoring"
every 15 minutes :

Manuell lassen sich einzelne Jobs mit »whenjobs --start Jobname« ausführen. Laufende Jobs lassen sich mit »whenjobs --cancel Nummer« abbrechen – die Nummer verrät hierbei der Aufruf von »--jobs« . Genauso kann Whenjobs die Ausgabe eines laufenden Jobs anzeigen: »whenjobs --tail Nummer« .

Millennium-sicher

Bei den Zeitangaben für zeitgesteuerte Jobs bietet das Programm eine ganze Reihe von Optionen: »second« , »minute« , »hour« , »day« , »week« , »month« , »year« und für längerfristige Planung sogar »decade« , »century« und »millenium« . Diese lassen sich mit »every« kombinieren oder mit einer konkreten Anzahl: Mit der Anweisung »every hour« läuft ein Skript also jede Stunde einmal, mit »every 15 minutes« alle 15 Minuten.

Bei den Ausdrücken bietet Whenjobs ebenfalls einen reichhaltigen Fundus: Sie lassen sich mit logischem Und (&&) und Oder (||) verknüpfen und negieren. Vergleiche zweier Ausdrücke mit diversen Kombinationen von Größer-, Kleiner- und Gleichzeichen finden entweder numerisch statt oder auf der Basis von String-Vergleichen.

Weitere eingebaute Funktionen können Variablen etwa mit ihrem vorherigen Wert vergleichen (»previous« ) oder feststellen, ob ein Wert ansteigt (»increases« ) oder fällt (»decreases« ). Wenn das nicht genügt, dürfen Anwender auch eigene Ausdrücke in Ocaml programmieren. Mehr Informationen dazu gibt die ausführliche Manpage des Tools, die auch zu allen anderen Aspekten detaillierte Hilfestellung gibt.

Ähnliche Artikel

comments powered by Disqus

Artikel der Woche

Systeme mit Vamigru verwalten

Auch wer nur kleine Flotten von Linux-Servern verwaltet, freut sich über Werkzeuge, die ihm diese Arbeit erleichtern. Vamigru tritt mit diesem Versprechen an. Wir verraten, was es leistet und wie Sie es in der eigenen Umgebung in Betrieb nehmen. (mehr)
Einmal pro Woche aktuelle News, kostenlose Artikel und nützliche ADMIN-Tipps.
Ich habe die Datenschutzerklärung gelesen und bin einverstanden.

Container

Wie setzen Sie Container ein?

  • Gar nicht
  • Docker standalone
  • Docker mit Kubernetes
  • Docker mit Swarm
  • Docker mit anderem Management
  • LXC/LXD
  • Rocket
  • CRI-O auf Kubernetes
  • Container auf vSphere
  • Andere (siehe Kommentare auf der Ergebnisseite)

Google+

Ausgabe /2018

Microsite