So richten Sie in der Crontab Cronjobs ein

Cron ist unter Linux ein System, um bestimmte Aufgaben regelmässig automatisch durchführen zu lassen.

Die zentrale Datenbank der Jobs ist dabei die Datei crontab, die jeder User mit folgendem Befehl einsehen und ändern kann:

crontab -e

Wer nur selten mit der crontab zu tun hat, für den ist der Aufbau dieser Datei allerdings immer wieder von neuem ein Rätsel. Welche Spalte ist war gleich wieder für die Stunde zuständig? Wie starte ich einen Job alle 5 Minuten?

Statt dann mühsam das Manual zu studieren, genügt ein Besuch auf corntab.com.

So hilft Ihnen crontab bei cron-Einträgen

Der Editor auf der Website bietet Ihnen für die verschiedenen Zeitintervalle wie Stunde oder Tag eine eigene Rubrik.

Wenn Sie einen der Punkte anklicken, wird der jeweilige Bereich expandiert und Sie können verschiedene Varianten wählen. So gibt es bei “Minute” etwa die Option, “jede Minute”, “alle x Minuten” oder die Wahl einer bestimmten Minute.

Der letzte Eintrag ist der gewünschte Befehl. Hier müssen Sie das Kommando eintragen, das Sie brauchen.

Dabei müssen Sie beachten, dass innerhalb des cron-Kontextes keine Pfade wirken. Also immer voll referenzierte Kommandos anwenden. Schreiben Sie zum beispiel nicht bloß “get, sondern /usr/bin/wget. Den Pfad für einen Befehl ermittelt das Kommando whereis.

Automatische Generierung der crontab-Zeile

Mit jeder von Ihnen vorgenommenen Änderung passt die Applikation die daraus erzeugte crontab-Zeile an und zeigt Sie oben auf der Seite ganz in fett.

keine Beschreibung

Wenn Sie mit den Eintragungen zufrieden sind, kopieren Sie einfach die Zeile heraus und fügen sie ihn Ihre persönliche crontab ein. Ist auf Ihrem System eine Zwischenablage nicht praktikabel, dann nutzen Sie den Versand der fertigen Zeile per Button email crontab.

Bedenken Sie dabei: Die meisten Unix-Varianten erwarten am Ende der Zeile eine Zeilenschaltung. Haben Sie zum Beispiel nur eine einzige Zeile in Ihrer crontab stehen und es fehlt am Ende das “Return”, dann wird dieser Eintrag ignoriert!

Das Ganze gibt es auch als kostenlose App fürs iPhone. Eine Android-Version ist in Vorbereitung.

Cronjob von Hand eintragen

Um für einen besonders häufigen CronjobTask Intervalle im Minutentakt einzutragen, gibt es eine praktische Abkürzung. Um zum Beispiel einen Cronjob alle fünf Minuten auszuführen schreiben Sie

0-59/5 * * * * /dir/jobname

Damit startet /dir/jobname alle 5 Minuten an jedem Tag.

Ergänzung: unsere Leser haben uns darauf hingewiesen, dass man statt “0-59” einfach einen Stern schreiben kann. Die elegantere Version obiger Zeile lautet also:

*/5 * * * * /dir/jobname

Cron: Doppelte Script-Ausführung per LOCK vermeiden

Oft wird ein Shell-Script durch Cron regelmäßig in kurzen Abständen aufgerufen – beispielsweise um ein Logfile auszuwerten. Dabei kann es vorkommen, daß plötzlich das selbe Script zweimal oder noch öfter aktiv ist. Das führt meist zu unerwünschten Ergebnissen, bis hin zum Datenverlust – wenn etwa temporäre Dateien überschrieben werden, die aber vom vorhergehenden Script-Aufruf noch garnicht fertig bearbeitet wurden.

Mutige Programmierer schätzen einfach die Laufzeit des Scripts und stellen die Cron-Aufrufe auf entsprechend sichere Abstände. Bloß: Das geht schnell schief. Ist z.B. die Logfile-Auswertung einmal für ein paar Stunden ausgefallen, dauert der erste Aufruf danach natürlich wesentlich länger.

Sicherer ist die Verwendung eines sogenannten LOCKs: Das ist einfach eine Datei, deren Vorhandensein anzeigt, daß das Script bereits läuft. Zusammen mit einer kurzen Abfrage im Script blockiert das zuverlässig die doppelte Ausführung.

Damit droht allerdings sofort die nächste Falle: Denn bricht das Script einmal mit einem Fehler ab, bleibt das LOCK zurück und das Script wird überhaupt nicht mehr ausgeführt. Im Code-Beispiel hilft dagegen eine Statusmeldung, sobald das LOCK zu alt ist – diese Ausgabe schickt ein korrekt konfigurierter Cron als Mail an den Administrator.

 

 

#!/bin/sh

#

PROG=`basename $0`

LOCK=/var/lock/$PROG.lock

((LOCKAGE=4*60 )) # in Minuten

#

#

# Lock testen, ggf. Meldung machen

#

if [[ -f $LOCK ]] ; then

if [[ `find $LOCK -mmin +$LOCKAGE` ]] ; then

echo “Vorsicht: Lock fuer $PROG ist aelter als $LOCKAGE Minuten”

fi

exit 3

fi

#

#

# Lock setzen

#

touch $LOCK

#

#

# hier der Programmablauf

echo hallo!

#

#

# Lock loeschen und Ende

#

rm $LOCK

exit 0

[ch]

Cron: (Fehler-)Meldungen von gestarteten Scripts und Programmen erhalten

Der Cron-Daemon schickt jede Ausgabe eines automatisch gestarteten Programms an den Eigentümer der jeweiligen Crontab – so ist zumindest die Standardeinstellung.

Nur: Auf kaum einem Server wird das Mailpostfach des lokalen Admins/Users tatsächlich genutzt. So verstauben die Fehlermeldungen dann ungelesen in irgendeiner Maildatei. Besser ist es, die Meldungen dort hinzuschicken, wo sie auch gelesen werden. Dafür genügt eine Zeile in der Crontab:

MAILTO=”meine@adresse.de”

Mit

MAILTO=””

lässt sich der Versand übrigens ganz abstellen. Das ist allerdings KEINE gute Idee – wer zuviele Cron-Meldungen bekommt, sollte lieber die aufgerufenen Scripts und Programme so verändern, daß nur noch echte Fehler zu einer Ausgabe (und damit zu einer Mail) führen.

[ch]

Cron: Ein Logfile für den Skript-Ablauf erzeugen

Viele Shell-Skripte laufen automatisiert ohne Benutzereingriff ab, etwa vom cron-Dämon gestartet. Da kann man sich bei einer Fehlersuche viele graue Haare ersparen, wenn das Skript-Biest über sein Tun Protokoll führt…

Mit wenigen Zeilen ist das erledigt:

 

#!/bin/sh

# Zunächst der Name des Logfiles

LOGFILE=’/var/log/skript.log’

# Die kleine Log-Funktion

function logg () {

echo -n `date +%Y%m%d%H%M%S` >>$LOGFILE

echo ” `basename $0` $1″ >>$LOGFILE

# Schreibt zunächst das aktuelle Datum ins Logfile

# -n unterdrückt den Zeilenumbruch am Ende

# Hinter + steht bei date die Formatierung, in diesem Fall z.B. 20051225125031

# wer’s menschen-lesbarer mag schreibt z.B. +”%d.%m.%Y %H:%M:%S”

# Hardcore C-Programmierer bevorzugen vermutlich einen C-Timestamp: +%s

# basename $0 ergibt den Aufruf-Namen des Skripts

# $1 enthält innerhalb der Funktion den Parameter, mit dem die Funktion aufgerufen wurde

}

logg “gestartet”

# protokolliert den Programmstart

#

# hier kommt der eigentliche Skript-Inhalt, der weitere logg-Aufrufe enthalten kann

#

logg “beendet”

 

[ch]

Ähnliche Beiträge