Auf eisfair wird zur Ausführung zeitgesteuerter Aufgaben der fcron-Daemon eingesetzt.

Anlegen con cron-Jobs

Üblicherweise werden diese im Menü „System administration|Cron administration“ durch Auswahl des Menüpunktes „Edit configuration“ angelegt, z. B.:

CRON_X_NAME='Backup'
CRON_X_ACTIVE='yes'
CRON_X_TIMES='30 1 * * *'
CRON_X_COMMAND='/der/pfad/zum/backup-befehl'

Es ist auch möglich, eine Kette von Befehlen festzulegen, die durch „;“ voneinander zu trennen sind:

CRON_X_NAME='Backup'
CRON_X_ACTIVE='yes'
CRON_X_TIMES='30 1 * * *'
CRON_X_COMMAND='/pfad/zum/befehl_1 ; /der/pfad/zum/backup-befehl ; /pfad/zum/befehl_2'

Diese so angelegten cron-Jobs werden mit den Rechten des Users „root“ ausfgeführt.

Für Erläuterungen zu der Definition der Ausführungszeit findet man z. B. hier eine schöne Beschreibung.

Tritt bei der Ausführung des Jobs ein Fehler auf, was fcron an einem Errorlevel <> 0 feststellt, bekommt root eine Mail von fcron mit der kompletten Ausgabe des Befehl/der Befehlskette. Um immer die Ausgaben per Mail zu erhalten, muss man dafür sorgen, dass der Job eben mit einem Errorlevel <> 0 endet.

Soll eine Aufgabe mit den Rechten eines anderen Users ausgeführt werden, muss unter /var/cron/etc ein Verzeichnis mit dem Namen des Users angelegt werden. In diesem Verzeichnis können dann beliebig benannte Dateien abgelegt werden, in denen dann cron-Jobs nach folgendem Muster definiert werden:

20 5 * * * /pfad/zu/meinem/cron-befehl

oder auch hier als Befehlskette:

20 5 * * * /pfad/zum/befehl_1 ; /pfad/zu/meinem/cron-befehl ; /pfad/zum/befehl_2

Um einen solchen manuellen Eintrag zu aktivieren, ist

eis # /var/install/config.d/cron.sh

auszuführen.

Bei der Namenswahl für die Datei bitte Augenmass bewahren, da in der Verzeichnisstruktur auch die cron-Jobs verschiedener eisfair–1-Pakete abgelegt werden, damit die sich nicht gegenseitig überschreiben.

Eine Auflistung aller cron-Jobs mit Angabe der nächsten Ausführung erhält man auf der Kommandozeile mit folgendem Befehl:

eis # fcrondyn -x ls

Fehlersuche in cron-Jobs

Man stößt möglicherweise auf das Problem, dass ein selbstgeschriebenes Programm/Skript zwar auf der Kommandozeile aber nicht als cron-Job korrekt funktioniert.

Vor einiger Zeit haben die Maintainer des fcron-Daemons aus Sicherheitsgründen eine Verschärfung eingeführt, die insbesondere die Umgebung (Environment), in der der cron-Job ausgeführt wird, betrifft. Wichtig ist hier meist die Einschränkung in der PATH-Variablen, die nun nicht mehr /sbin und /usr/sbin enthält. Benutzt man nun in seinem per cron auszuführenden Skript Kommandos, die sich in diesen Pfaden befinden, aber nicht mit vollem Pfad angegeben wurden, werden diese dadurch nicht mehr gefunden. Das kann sogar passieren, wenn man glaubt nur interne Befehle in einem php-Skript verwendet zu haben, z. B. die interne php-Funktion mail.

Man kommt Problemen mit der Ausführung von cron-Jobs meist auf die Spur, wenn man dafür sorgt, dass das von fcron auszuführende Programm einen Fehler an fcron (Errorlevel <> 0) zurückliefert, denn dann versendet fcron eine Fehlermail an root mit der kompletten Ausgabe des Skripts/Befehls/Programms. In Shell-Skripten schreibt man dazu am Ende ein „exit 1“, in php-Skripten am Ende ein „exit(1);“; in allen Programmiersprachen gibt es eine analoge Möglichkeit hierzu.

Beispiel: Versenden einer Mail mittels eines php-Skriptes per fcron-Job

Man wird sich wundern, dass trotz Ausführung als cron-Job nie eine Mail kommt, aber auf der Kommandozeile funktioniert es prima.

Wenn dieses Skript nun einen Fehler durch Setzen des Errorlevels auf einen Wert <> 0 an fcron meldet, erhält man vom diesem eine Mail etwa folgenden Inhalts:

sh: sendmail: command not found
Job '/usr/bin/php -f /pfad/zu/mail.php' terminated (exit status: 1) (mailing output)

Nun wird es klar: Die interne php-Funktion bemüht das sendmail-Kommando, welches sich in /usr/sbin befindet. Die mail-Funktion wird also einfach sendmail ohne Angabe des Pfades starten wollen und da /usr/sbin nicht im PATH der fcron-Umgebung liegt, wird das sendmail-Kommando nicht gefunden.

Man kann nun nicht die php-Funktion mail ändern, indem man in dieser den Pfad zu sendmail ergänzt, aber dennoch gibt es für dieses Problem eine einfache Lösung: Die PATH-Variable der fcron-Umgebung muss um den entsprechenden Pfad vor der Ausführung des mail-Skriptes zu ergänzen. Die Befehlskette für cron-Job ist daher wie folgt zu definieren:

PATH=$PATH:/usr/sbin ; export PATH ; /usr/bin/php -f /pfad/zu/mail.php

In selbstgeschriebenen Skripten und Programmen sollte man daher möglichst alle externen Kommandos mit vollem Pfad ausführen.