Gentoo Linux Cron Guide
1.
Cron Grundlagen
Was ist Cron
Cron läuft als Daemon, der Prozesse zu festgelegten Zeitpunkten startet, die
mit Hilfe des crontab Befehls eingegeben werden können. Cron überprüft
jede Minute ob es Cron-Jobs, die ausgeführt werden müssen, in irgendeiner der
Benutzer crontabs gibt.
Notiz:
crontab ist sowohl der Name einer Liste von Cron-Jobs als auch
der Name des Kommandos zum Aufruf zum Editieren dieser Liste.
|
Cron in der Praxis
Es gibt einige Implementierungen von Cron in Portage, die man zum Einsatz
im eigenen System wählen kann. Im Allgemeinen bieten alle ein ähnliches
Interface, sprich die Verwendung von crontab oder eines ähnlichen
Befehls. Für Systeme, die nicht 24/7 laufen (Laptop, Desktop), gibt es ein
weiteres Tool, das mit Hilfe von Cron arbeitet und dafür sorgt, dass Aufgaben
in vorgegebenen Intervallen ausgeführt werden - Anacron.
Es ist auch erwähnenswert, dass alle verfügbaren Cron Pakete von
sys-process/cronbase abhängig sind. Zwischen diesem Paket und den Cron
Paketen existiert technisch gesehen keine Abhängigkeit, aber es bietet eine
cron-ähnliche Funktionalität, welche die meisten Nutzer zu schätzen wissen.
Zunächst muss man sich entscheiden welche Cron Implementierung man verwenden
möchte. Folgender Überblick soll die Entscheidung erleichtern:
2.
Welcher Cron darf es sein?
Vixie Cron
Vixie Cron basiert auf SysV Cron und bietet dem Benutzer eine Vielfalt an
Einstellungsmöglichkeiten. Jeder Benutzer hat seine eigene crontab und hat die
Möglichkeit Umgebungsvariablen in dieser crontab festzulegen. Im Gegensatz zu
anderen Cron Varianten unterstützt Vixie Cron auch SELinux und PAM. Es
unterstützt weniger Architektueren als Dcron, aber mehr als Fcron.
Features von sys-process/vixie-cron:
- Unterstützung von SELinux
- Unterstützung von PAM /etc/security/limits.conf
-
Festlegen von Umgebungsvariablen in crontabs (PATH, SHELL, HOME, etc.)
-
Jeder Benutzer kann seine eigene crontab verwenden; der Zugriff wird durch
cron.allow und cron.deny festgelegt
Dillons Cron
Dcron bietet eine einfache, elegante und sichere Implementierung von Cron. Es
erlaubt keine eigenen Umgebungsvariablen in crontabs und alle Cron-Jobs werden
von /bin/sh aus aufgerufen. Es bietet auch wie Vixie Cron jedem
Benutzer seine eigne crontab.
Features von sys-process/dcron:
- Schnell, einfach und frei von unnötigen Features
-
Der Zugriff auf crontab ist auf die Gruppe Cron beschränkt, d.h. es
bietet keine Anbindung zu anderen Schnittstellen.
Fcron
Fcron ist eine möglicher Ersatz für Vixie Cron und Anacron. Es ist mit weiteren
Features ausgestatten und dafür entwickelt, auf Systemen zu rennen, die sich
nicht im Dauerbetrieb befinden. Es unterstützt das Festlegen von
Startbedingungen von Jobs und bietet Kontrolle zur Serialisierung von Jobs.
Außerdem gibt es einem die Möglichkeit Jobs nice-Werte zuzuweisen und auch Jobs
bei Systemstart ausführen zu lassen. Weitere Informationen findet man auf fcron's home page.
Features von sys-process/fcron:
-
Entwickelt, um auf Systemen zu laufen, die sich nicht im Dauerbetrieb
befinden, d.h. es kann einen Job nach einem Neustart ausführen als ob er
vergessen worden wäre
-
Einstellen von Umgebungsvariablen und vielen weiteren Optionen in crontabs
-
Jeder Benutzer kann seine eigene crontab verwenden, der Zugriff ist durch
cron.allow und cron.deny festgelegt
-
Verbesserte crontab Syntax mit Unterstützung von vielen neuen Features
bcron
bcron ist ein neues Cron-System, das mit besonderem Blick auf sichere
Operationen entworfen wurde. Dafür ist das System in mehrere separate Programme
aufgeteilt, wobei jedes für eine separate Aufgabe zuständig ist und eine
strikt kontrollierte Kommunikation zwischen ihnen stattfindet. Die
Benutzungsschnittstelle ist ein 1:1-Ersatz für ähnliche Systeme (z.B.
vixie-cron), aber die Interna unterscheiden sich sehr. Für weitere
Informationen können Sie sich die bcron-Homepage unter
http://untroubled.org/bcron/ ansehen.
Features von sys-process/bcron:
- 1:1-Ersatz für vixie-cron
- Multi-Prozess-Design
- Native Sommerzeitunterstützung
Anacron
Anacron ist kein Cron Daemon, sondern etwas, das für gewöhnlich in Verbindung
mit eines solchen arbeitet. Es führt Befehle in festgelegten Intervallen in
Tagen aus und geht nicht davon aus, dass das System 24/7 läuft. Es führt Jobs
aus, die ausgelassen wurden, weil z.B. das System gerade nicht in Betrieb war.
Anacron benötigt einen Cron Daemon um regelmäßig ausgeführt werden zu können.
3.
Verwendung von Cron
Installation
Wählen einer Cron Variante und sie emergen.
Befehlsauflistung 3.1: Installation von dcron |
# emerge dcron
# /etc/init.d/dcron start
# rc-update add dcron default
|
Sollte man sich nicht für fcron entschieden haben, könnte man zusätzlich auch
Anacron installieren.
Befehlsauflistung 3.2: Installation von Anacron |
# emerge anacron
# /etc/init.d/anacron start
# rc-update add anacron default
|
System crontab
Die Hinweise nach der Installation von gewissen Cron Paketen raten an
zuallererst crontab /etc/crontab auszuführen. Die Datei
/etc/crontab ist die System crontab. Eine Cron Installation
in Verbindung mit sys-process/cronbase verwendet sie dazu, um Skripte in
/etc/cron.{daily,hourly,weekly,monthly} auszuführen. Man beachte,
dass Vixie Cron neue Jobs automatisch in /etc/crontab
berücksichtigt. Bei Dcron und Fcron müssen Benutzer nach jeder Änderung von
/etc/crontab crontab /etc/crontab ausführen.
Beachten Sie, dass Jobs, die in der System crontab eingetragen sind, von
crontab -l nicht angezeigt werden müssen.
Natürlich kann man auch ganz ohne System crontab arbeiten. Wenn man Dcron oder
Fcron verwendet, reicht es crontab /etc/crontab nicht auszuführen.
Falls Sie vixie-cron oder bcron wählen, sollten Sie alle Zeilen in
/etc/crontab auskommentieren.
Befehlsauflistung 3.3: Auskommentieren aller Zeilen in /etc/crontab |
# sed -i -e "s/^/#/" /etc/crontab
|
Zugriff auf Cron für andere Benutzer
Wenn Sie auch anderen Benutzer als root Zugriff auf den Cron Daemon geben
wollen, sollten Sie sich folgenden Abschnitt durchlesen. Ansonsten können Sie
einfach zum nächsten Abschnitt Zeitlicher Ablauf von
Cron-Jobs übergehen.
Notiz:
Einem Benutzer Zugriff auf die crontab zu geben, erlaubt es ihm nicht Cron-Jobs
als root auszuführen. Möchte man auch Benutzern erlauben, die root crontab zu
ändern, sollte man sich mit sudo auseinandersetzen. Bitte
berücksichtigen Sie für weitere Einzelheiten unsere Gentoo Sudo(ers) Anleitung.
|
Egal welches Cron Paket man verwendet, möchte man einem Benutzer Zugriff auf
die crontab geben, muss er in der Cron Gruppe sein. Wenn man z.B. den Benutzer
wepy zur Cron Gruppe hinzufügen möchte:
Befehlsauflistung 3.4: Hinzufügen eines Benutzers zur Cron Gruppe |
# gpasswd -a wepy cron
|
Notiz:
Wenn Sie einen Benutzer der Cron Gruppe hinzufügen, vergewisseren Sie sich,
dass sich der Benutzer ab- und wieder anmeldet, damit diese Änderung der
Gruppenzugehörigkeit auch wirksam wird.
|
Wenn man Dcron verwendet, ist das alles, was man tun muss, um einem
Benutzer Zugriff auf die crontab zu geben. Dcron Benutzer können mit dem
nächsten Abschnitt Zeitlicher Ablauf von Cron
Jobs fortfahren, alle anderen sollten hier weiterlesen.
Wenn man nun Fcron verwendet, muss man die Dateien
/etc/fcron/fcron.deny und /etc/fcron/fcron.allow
editieren. Am sichersten ist es, zuerst jedem den Zugriff in
/etc/fcron/fcron.deny zu verweigern und dann einzelnen Benutzern
explizit den Zugriff erlauben /etc/fcron/fcron.allow.
Wichtig:
Sollten weder /etc/fcron/fcron.allow noch
/etc/fcron/fcron.deny vorhanden sein, ist es allen Benutzern in
der Cron Gruppe erlaubt die crontab zu verwenden. Fcron wird mit einer
Standard fcron.allow, die allen Benutzern in der Cron
Gruppe den Zugriff auf die fcrontab erlaubt, installiert.
|
Befehlsauflistung 3.5: Rechte in fcron.deny |
all
|
Z.B. soll es dem Benutzer wepy erlaubt sein, seine eigenen Cron-Jobs zu
erstellen. Dazu muss er wie folgt in /etc/fcron/fcron.allow
eingetragen sein:
Befehlsauflistung 3.6: Rechte in fcron.allow |
wepy
|
Wer nun Vixie Cron als Cron Daemon gewählt hat, braucht nur
/etc/cron.allow anpassen.
Wichtig:
Man sollte unbedingt beachten, dass, wenn nur /etc/cron.allow
vorhanden ist, dann nur die dort aufgezählten Benutzer der Cron Gruppe Zugriff
haben, aber wenn eine leere /etc/cron.deny angelegt ist, dann
haben alle Benutzer der Cron Gruppe Zugriff! Also sollte es nie eine leere
/etc/cron.deny geben, wenn es dazu keine
/etc/cron.allow gibt.
|
Möchte man dem Benutzer wepy den Zugriff erlauben, fügt man ihn wie
folgt zu /etc/cron.allow hinzu:
Befehlsauflistung 3.7: Rechte in /etc/cron.allow |
wepy
|
Zeitlicher Ablauf von Cron-Jobs
Wie man nun die crontabs editiert, ist vom jeweiligen Paket abhängig, aber alle
unterstützen dieselbe Menge an Basisbefehlen: Hinzufügen, Ersetzen, Editieren,
Löschen und Auflisten von Cron-Jobs in crontabs. Die folgende Tabelle zeigt wie
diese Befehle mit dem jeweiligen Paket auszusehen haben.
| Version |
crontab editieren |
crontab löschen |
crontab hinzufügen |
cronjobs auflisten |
| dcron |
crontab -e |
crontab -d [Benutzer] |
crontab Datei |
crontab -l |
| fcron |
fcrontab -e |
fcrontab -r [Benutzer] |
fcrontab Datei |
fcrontab -l |
| vixie-cron & bcron |
crontab -e |
crontab -r -u [Benutzer] |
crontab Datei |
crontab -l |
Notiz:
Wenn man das Kommando zum Entfernen verwendent und diesem kein Argumente
übergeben werden, wird die crontab vom aktuellen Benutzer gelöscht.
|
Notiz:
Fcron hat auch einen Symlink von crontab zu fcrontab.
|
Bevor man nun einen dieser Befehle verwenden kann, muss man zuerst den Aufbau
der crontab selbst verstehen. Jede Zeile in einer crontab muss fünf Zeitfelder
in folgender Reihenfolge beinhalten: Minuten (0-59), Stunden (0-23), Tage des
Monats (1-31), Monate (1-12), und Tage der Woche (0-7, Montag ist 1, Sonntag
ist 0 und 7). Tage der Woche und Monate Monats können durch Abkürzungen
wie mon, tue, jan, feb, u.s.w. angegenben werden. Jedes Feld kann durch einen
Wertebereich (z.B. 1-5 oder mon-fri), eine durch Komma getrennte Werteliste
(z.B. 1,2,3 oder mon,tue,wed) oder einen Wertebereich in Schritten (z.B.
1-6/2 anstatt 1,3,5) ersetzt werden.
Das mag anfangs etwas verwirrend aussehen, aber mit ein paar Beispielen kann
man die Syntax leichter verstehen.
Befehlsauflistung 3.8: Beispiele |
* * * * * /bin/false
35 1 4 * mon-wed /bin/false
25 22 2 3 * /bin/true
0 2 * * 1-5/2 /bin/false
|
Notiz:
Man beachte wie man konkrete Tage der Woche bzw. Tage des Monats bestimmt bevor
sie kombiniert werden. Wenn man für einen der beiden * verwendet, dann wird der
andere zuerst für die Auswertung in Betracht gezogen, wobei * in beide Felder
"täglich" bedeutet.
|
Um auszuprobieren, was soeben erklärt wurde, erstellt man ein paar Cron
Jobs. Zuerst erstellt man wie folgt eine Datei crons.cron:
Befehlsauflistung 3.9: Editieren von crons.cron |
$ nano crons.cron
10 3 1 1 * /bin/echo "Ich mag Cron nicht"
30 16 * 1,2 * /bin/echo "Ich mag Cron ein wenig"
* * * 1-12/2 * /bin/echo "Ich mag Cron wirklich gerne"
|
Jetzt kann man diesen crontab mit dem "Hinzufügen" Befehl von der Tabelle oben
zum System hinzufügen.
Befehlsauflistung 3.10: Eine neue crontab |
# crontab crons.cron
|
Notiz:
Wenn man nicht die Ausgabe dieser echo Befehle umleitet, sieht man diese Ausgabe
auch nicht wirklich.
|
Um sicherzugehen, dass die Cron-Jobs aufgenommen wurden, verwendet man den
passenden Befehl Auflisten von der Tabelle oben.
Befehlsauflistung 3.11: Auflisten der Cron-Jobs |
# crontab -l
|
Nun sollte man eine ähnlich Liste wie in crons.cron sehen. Wenn
nicht, muss wohl beim Hinzufügen ein falscher Befehl verwendet worden sein.
Diese crontab gibt jede Minute an ungeraden Monaten "Ich mag Cron wirklich
gerne" aus. Offensichtlich macht man das nur, wenn man Cron wirklich mag. Die
crontab wird auch "Ich mag Cron ein wenig" um 16:30 jeden Tag im Januar und
Februar ausgeben. Und schließich wird sie auch "Ich mag Cron nicht" um 3:10 am
1. Januar ausgeben.
Wenn man Anacron verwendet, sollte man hier weiterlesen. Ansonsten kann man mit
dem nächsten Abschnitt weitermachen Editieren von
crontabs.
Benutzer die Anacron verwenden, müssen /etc/anacrontab
editieren. Diese Datei hat vier Felder: Anzahl der Tage zwischen jeden Aufrufs,
die Verzögerung in Minuten bis zur eigentlichen Ausführung, der Name des Jobs
und der Befehl, der ausgeführt werden soll.
Wenn man z.B. möchte, dass alle fünf Tage, zehn Minuten nachdem Anacron
gestartet wurde echo "Ich mag Anacron" ausgeführt werden soll, sollte
dies so aussehen:
Befehlsauflistung 3.12: /etc/anacrontab |
5 10 Zeitvertreib /bin/echo "Ich mag Anacron"
|
Anacron beendet sich, nachdem alle Jobs der anacrontab ausgeführt wurden. Soll
nun Anacron täglich diese Jobs überprüfen, muss dazu Cron verwendet werden. Wie
dies nun realisiert wird, ist im nächsten Abschnitt beschrieben.
Editieren von crontabs
Natürlich wird man die crontab im Alltag nicht mit Jobs belasten, die einem
sagen, wie gern man Cron hat. Diese überflüssigen Jobs entfernt man mit dem
dazugehörigen Befehl Löschen aus der Tabelle weiter oben. Anschließend
gibt man die Cron Jobliste nochmals aus, um sicher zu gehen, dass alles
funktioniert hat.
Befehlsauflistung 3.13: Löschen einer crontab |
# crontab -d
# crontab -l
|
Jetzt sollten keine Cron-Jobs mehr in der Ausgabe von crontab -l zu
sehen sein. Sollten doch noch Jobs aufgelistet werden, bedeutet das, dass das
Entfernen des crontabs fehlschlug und sie sicherstellen sollten, dass Sie
den korrekten Entfernen-Befehl Ihres Cron-Pakets verwendet haben.
Nun haben wir einen sauberen Zustand, und man kann etwas Nützlicheres in die
root crontab eintragen. Dass der Befehl updatedb einmal pro
Woche ausgeführt werden soll, damit mlocate auch korrekte Ergebnisse
liefert, erscheint doch sinnvoll. Um dies der crontab hinzuzufügen, muss
zuerst crons.cron wie folgt angepasst werden:
Befehlsauflistung 3.14: Eine echte crontab |
22 2 * * 1 /usr/bin/updatedb
|
Das veranlasst Cron updatedb um 2:22 am Montag morgen wöchentlich aufzurufen.
Die neue crontab muss noch mit dem Befehl Hinzufügen von der Tabelle
oben eingefügt werden und die Liste der Cron-Jobs sollte auch nochmals
überprüft werden.
Befehlsauflistung 3.15: Auflisten der Cron-Jobs |
# crontab crons.cron
# crontab -l
|
Angenommen man will emerge --sync auch zur Liste der Befehle, die
täglich ausgeführt werden sollen, hinzufügen. Eine Möglichkeit wäre
crons.cron anzupassen und crontab crons.cron aufzurufen.
Oder man erledigt das mit dem Editieren Befehl von der Tabelle oben.
Dies ermöglicht, die crontab eines Benutzers direkt zu editieren ohne externe
Dateien wie crons.cron anpassen zu müssen.
Befehlsauflistung 3.16: Direktes Editieren der crontab |
# crontab -e
|
Das öffnet die crontab des Benutzers in einem Editor. emerge --sync soll
jeden Tag um 6:30 ausgeführt werden, also muss das wie folgt eingetragen werden:
Befehlsauflistung 3.17: Eine echte crontab |
22 2 * * 1 /usr/bin/updatedb
30 6 * * * /usr/bin/emerge --sync
30 7 * * * /usr/sbin/anacron -s
|
Man sollte erneut die Liste der Cron-Jobs überprüfen, wie auch im vorigen
Beispiel um sicherzustellen, dass alle Jobs geplant sind. Wenn alle vorhanden
sind, ist alles erledigt.
4.
cronbase verwenden
Wie bereites erwähnt wurde, hängen alle Cron-Pakete von
sys-process/cronbase ab. Das cronbase-Paket erstellt
/etc/cron.{hourly,daily,weekly,monthly} und ein Skript
run-crons. Sie dürften auch bemerkt haben, dass /etc/crontab
folgendes enthält:
Befehlsauflistung 4.1: Standard System crontab |
*/15 * * * * test -x /usr/sbin/run-crons && /usr/sbin/run-crons
0 * * * * rm -f /var/spool/cron/lastrun/cron.hourly
0 3 * * * rm -f /var/spool/cron/lastrun/cron.daily
15 4 * * 6 rm -f /var/spool/cron/lastrun/cron.weekly
30 5 1 * * rm -f /var/spool/cron/lastrun/cron.monthly
|
Um nicht zu weit ins Detail zu gehen, können wir einfach annehmen, dass die
Kommandos ihre Skripte stündlich, täglich, wöchentlich und monatlich ausführen.
Diese Methode Cron-Jobs zeitlich einzuplanen hat einige wichtige Vorteile.
-
Sie werden ausgeführt auch wenn Ihr Computer zu dem geplanten
Ausführungszeitpunkt ausgeschaltet war
-
Es ist für Paketverwalter einfacher ihre Skripte an diese bekannten Stellen
einzufügen
-
Sie wissen genau wo Ihre Cron-Jobs und Ihre crontab gespeichert ist, was es
Ihnen auch erleichtert, diesen Teil Ihres Systems zu sichern
Notiz:
Nochmals ist es wichtig zu erwähnen, dass Vixie Cron und bcron
/etc/crontab automatisch auslesen, während dcron und fcron das
nicht tun. Bitte lesen Sie den Abschnitt System Crontab, um mehr darüber zu erfahren.
|
5.
Anmerkungen
Fehlersuche
Sollte Cron nicht wie gewünscht die Jobs aufrufen, gibt es hier eine
Checkliste, die man durchgehen kann.
-
Läuft Cron? Führen Sie ps ax | grep cron aus und prüfen Sie, ob
es dabei ist!
-
Arbeitet Cron die Jobs ab? Folgendes ausprobieren: * * * * * /bin/echo
"foobar" >> /beschreibbare_Datei, und überprüfen ob in die Datei
minütlich foobar geschrieben wird.
-
Funktioniert der Befehl im Cron Job? Folgendes ausprobieren: * * * * *
/bin/foobar > /beschreibbare_Datei 2>&1, nach Fehlern in der Datei
/beschreibbare_Datei suchen
-
Kann Cron den Befehl ausführen? Die Protokolldatei von Cron, für
gewöhnlich /var/log/cron.log oder /var/log/messages,
auf Fehler überprüfen.
-
Gibt es dead.letters? Sollte es ein Problem geben, sendet
Cron normalerweise eine Email. Also Emails überprüfen und - falls vorhanden -
die Datei ~/dead.letter überprüfen.
Man sollte unbedingt berücksichtigen, dass sich die einzelnen Cron Pakete
deutlich unterscheiden, was schon alleine die unterschiedliche Anzahl an
Features der Pakete bestätigt. Es ist auch immer von Vorteil, die man pages für
crontab, fcrontab oder anacrontab aufzurufen - je nach dem, was man verwendet.
Viel Glück!
Die Inhalte dieses Dokuments sind, sofern nicht explizit
anders genannt, unter der Creative Commons -
Namensnennung / Weitergabe Lizenz lizenziert. Die Gentoo Name and Logo
Usage Guidelines treffen zu.
|