[[Vorlage(Getestet, general)]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:Pakete_installieren:Pakete installieren] (Optional) [:Paketquellen_freischalten:Paketquellen freischalten] (Optional) }}} [[Inhaltsverzeichnis(2)]] Der Cron-Daemon ist ein Dienst, der automatisch Skripte und Programme zu vorgegebenen Zeiten starten kann. Der auszuführende Befehl wird in einer Tabelle, der sogenannten '''crontab''', gespeichert. Jeder Benutzer des Systems darf eine solche crontab anlegen. Diese Tabelle besteht aus sechs Spalten; Die ersten fünf dienen der Zeitangabe (Minute, Stunde, Tag, Monat, Wochentage), die letzte enthält den Befehl. Die einzelnen Spalten werden durch Leerzeichen oder Tabulatoren getrennt. {{{#!vorlage Hinweis Sollte während der Ausführung dieser automatisierten Skripte ein Fehler auftreten, so versuchen sowohl Cron als auch Anacron, diese Fehlermeldung per EMail an den Systemadministrator zu schicken. Dies ist allerdings nur möglich, wenn ein sogenannter "Mail Transfer Agent" - beispielsweise [:Postfix:] - installiert ist. }}} = Eine Crontab für einen Benutzer einrichten = Um eine Cron-Tabelle für einen Benutzer einzurichten, muss man ein Terminalfenster öffnen [1] und den Befehl zum Editieren der Tabelle eingeben {{{#!vorlage Befehl crontab -e }}} Daraufhin wird der Standardeditor mit der Tabelle geöffnet. Hat der Benutzer dies zuvor noch nie gemacht, so sieht man nur eine leere Datei. Als Beispiel ist hier eine Cron-Tabelle zur Vorlage für das Erstellen einer eigenen crontab: {{{#----------------------------------------------------------------- # Shell variable for cron SHELL=/bin/bash # PATH variable for cron PATH=/usr/local/bin:/usr/local/sbin:/sbin:/usr/sbin:/bin:/usr/bin:/usr/bin/X11 #M S T M W Befehl #----------------------------------------------------------------- 5 * * * * /home/username/script/script1.sh > /dev/null */10 * * * * /usr/bin/script2.sh > /dev/null 2>&1 59 23 * * 0 cp /pfad/zu/datei /pfad/zur/kopie * * * * * DISPLAY=:0 zenity --info --text "Beispiel für das Starten eines Programmes mit GUI" 0 0 * * * backup #----------------------------------------------------------------- }}} Im ersten Abschnitt stehen die Angaben für die Variablen $PATH und $SHELL. Im unteren Teil dann die einzelnen Cronjobs. In einer Zeile kommen zuerst die fünf Felder für die Zeiten (Minute, Stunde, Tag, Monat, Wochentage) und danach der auszuführende Befehl. In diesem Beispiel werden die Befehle 1. Zu jeder vollen Stunde und fünf Minuten (also 0:05, 1:05, 2:05,...) 1. Alle 10 Minuten 1. Jeden Sonntag um 23:59 1. Jede Minute ein Programm mit GUI, die Display-Variable muss dazu übergeben werden 1. Jeden Tag schlag Mitternacht 00:00 Uhr ausgeführt. {{{#!vorlage Hinweis Wichtig ist, dass am Ende der Tabelle noch ein Kommentar oder eine Leerzeile stehen. Ähnlich wie die [:fstab:], muss die '''crontab''' mit einer Leerzeile enden! }}} Erzeugt der durch den Cron-Daemon aufgerufene Befehl eine Ausgabe, so wird alles, was auf der Konsole ausgegeben wird, an den Benutzer per Email geschickt, unter dessen Benutzerkonto der Befehl ausgeführt wurde. Möchte man dies nicht, so muss man die Ausgabe umleiten. Als Beispiel soll ein Server daraufhin überprüft werden, ob dieser online ist. Hierzu wird alle fünf Minuten ein Ping an den Rechner geschickt. Ein erfolgreicher Ping ist uninteressant, im Falle eines Fehlers sollte jedoch der Cronjob eine Email mit dem Ergebnis des gescheiterten Pings ausgeben. Dies erreicht man, indem die Standardausgabe an /dev/null umleitet. Fehlermeldungen werden dadurch - wie gewünscht - verschickt, das positive Ergebnis verworfen. {{{*/5 * * * * ping -c 1 192.168.0.1 > /dev/null }}} Möchte man keinerlei Ausgaben des Cronjobs erhalten - z.B. bei einem regelmäßigen Ping an eine Internetadresse, um zu verhindern, dass die Dial-Up-Verbindung getrennt wird - so muss die Weiterleitung wie folgt aussehen: {{{*/5 * * * * ping -c 1 www.google.de > /dev/null 2>&1 }}} Dadurch wird jegliche Ausgabe des Cronjobs verworfen. Hier ist noch kurz eine Übersicht, wie sich der Cronjob aufbaut: {{{* * * * * Befehl der ausgeführt werden soll - - - - - | | | | | | | | | +----- Wochentag (0 - 7) (Sonntag ist 0 und 7; oder Namen, siehe unten) | | | +------- Monat (1 - 12) | | +--------- Tag (1 - 31) | +----------- Stunde (0 - 23) +------------- Minute (0 - 59; oder Namen, siehe unten) }}} Für die Wochentage und die Monate können die drei ersten Buchstaben des englischen Namen benutzt werden, z.B. ``Sun`` für Sonntag. Groß-/Kleinschreibung spielt dabei keine Rolle, allerdings sind keine Angaben von Zeiträumen erlaubt, dazu müssen Ziffern verwendet werden. Angaben von Zeiträumen und Schrittweiten innerhalb dieser Zeiträume sind erlaubt, sofern Ziffern benutzt werden. Setzt man beispielsweise für die Stunde ``8-10``, wird der Befehl stündlich um 8, 9 und 10 Uhr ausgeführt. Statt der Schreibweise ``8-10`` kann auch ``8,9,10`` geschrieben werden. Setzt man hingegen */2 wird der Befehl alle zwei Stunden ausgeführt. Beides kann kombiniert werden, so bedeutet ``1-9/2`` das selbe wie ``1,3,5,7,9``. Zur Vereinfachung können die ersten fünf Felder auch durch eine einzelne Zeichenkette ersetzt werden. Hierfür sind acht Schlüsselwörter definiert: * ||'''String''' ||'''Bedeutung''' || ||@reboot ||Einmalig beim Start || ||@yearly ||Einmal im Jahr (``0 0 1 1 *``) || ||@annually || Einmal im Jahr (``0 0 1 1 *``) || ||@monthly || Einmal im Monat (``0 0 1 * *``) || ||@weekly ||Einmal pro Woche (``0 0 * * 0``) || ||@daily ||Einmal pro Tag (``0 0 * * *``) || ||@midnight ||Einmal pro Tag (``0 0 * * *``) || ||@hourly ||Einmal pro Stunde (``0 * * * *``) || == Benachrichtigungen == Mit der ``MAILTO``-Variable kann ein Empfänger für die Benachrichtigungen unabhängig vom Besitzer der Cron-Tabelle festgelegt werden (``MAILTO=irgendwer``). Wird die Variable als inhaltsleer deklariert (``MAILTO=""``), so werden keine Benachrichtigungen versendet. == Cron-Tabelle des Benutzers Root == Natürlich kann auch Root eine Cron-Tabelle anlegen. Alle Cronjobs, die in dieser Tabelle stehen, werden mit root-Rechten ausgeführt: {{{#!vorlage Befehl sudo crontab -e }}} = Die systemweite Cron-Tabelle: /etc/crontab = Möchte man jedoch einen Cronjob erstellen, der mit speziellen Rechten ausgeführt werden soll, so bietet es sich an, diesen Job in die systemweite Cron-Tabelle einzutragen. Diese Tabelle unterscheidet sich nicht stark von einer normalen Cron-Tabelle, sie besitzt jedoch noch eine Spalte mehr, in der der Benutzer eingetragen wird, unter dem der jeweilige Befehl ausgeführt werden soll. {{{# /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file. # This file also has a username field, that none of the other crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 17 * * * * root run-parts --report /etc/cron.hourly 59 23 * * * username /pfad/zu/skript.sh }}} Dies ist besonders nützlich, wenn Server, die ihren eigenen Benutzer haben wie Apache mit www-admin, über cronjobs gesteuert werden sollen. Oder man für Benutzer Jobs anlegen möchte, die der Nutzer jedoch selber nicht verändern können soll. Häufiger tritt das Problem auf, dass ein Script in der Konsole funktioniert, nicht aber wenn es über die systemweite Cron-Tabelle gestartet wird. Das liegt daran, dass sich das Startverhalten einer Shell über '''/etc/crontab''' von dem einer Loginshell unterscheidet, was z. B. Pfade und Umgebungsvariablen betrifft. In diesem Fall sollte man komplette Pfadangaben im Skript verwenden oder ein Skript mit folgendem Eintrag in der Cron-Tabelle starten: {{{59 23 * * * username /bin/bash --login /pfad/zu/skript.sh }}} [[Anker(anacron)]] = Anacron: Anac(h)ronistic Cron = Cron startet einzelne Cronjobs immer nur zu den eingetragenen Zeiten. Legt man also einen Cronjob an, der täglich um 18.00 Uhr ausgeführt wird, so wird der Job an diesem Tag nicht ausgeführt, falls der Rechner um Punkt 18 Uhr nicht angeschaltet war. Für Jobs, die regelmäßig ausgeführt werden müssen, wobei der Rechner nicht durchgehend läuft, ist Cron daher nicht ideal. Wenn man Pech hat, wird z.B. ein wichtiges Backup an diesem Tag nicht erstellt. Als Alternative zu Cron bietet sich daher Anacron an. Anacron ist ein cron-ähnlicher Taskplaner. Allerdings erfordert er das kontinuierliche Laufen des Systems nicht. Er kann zum Ausführen von täglich, wöchentlich oder monatlich anstehenden Aufträgen verwendet werden, die in der Regel von cron ausgeführt werden müssten. Anstatt einer crontab muss nur das auszuführende Skript oder Programm in das entsprechende Verzeichnis des Anacron-Dienstes kopiert oder verlinkt werden. {{{/etc/cron.hourly /etc/cron.daily /etc/cron.monthly /etc/cron.weekly }}} Die Namen der Verzeichnisse sprechen für sich. Skripte, die dort abgelegt sind, werden auch durch den Anacron-Dienst ausgeführt. Am besten schaut man sich kurz die Skripte in diesen Verzeichnissen ab, bevor man selber dort etwas ablegt. {{{#!vorlage Hinweis Der Skriptname darf nur große und kleine Buchstaben, Ziffern, Unterstriche und Bindestriche enthalten. Andernfalls wird das Skript nicht ausgeführt. Das exakte Zeichenalphabet wird durch folgenden regulären Ausdruck definiert: "^[a-zA-Z0-9_-]+$". Punkt und Umlaute sind also beispielsweise nicht erlaubt. }}} = Häufige Fehler = == Befehl klappt in Script und Shell, aber nicht im Cronjob == Der ``PATH`` wurde nicht, wie oben im Beispiel, gesetzt, und Cron findet Kommandos nicht, die von der Konsole fehlerfrei funktionieren. Cron benutzt von sich aus nicht die PATH-Variable des Users, so dass man entweder einen PATH definieren muss oder die benutzten Programme mit vollem Pfad aufrufen muss. Wenn Anacron verwendet wird, darf '''im Dateinamen kein Punkt''' enthalten sein. Mehr zu den Dateinamen findet sich im Hinweiskasten von [#anacron Anacron: Anac(h)ronistic Cron] Ubuntu Server 8.10: Wenn in ''"/var/log/syslog"'' Einträge wie ''"CRON .. : Authentication failure"'' und ''"CRITICAL: cannot initialize libpolkit"'' vorhanden sind, hilft die Installation des Packets ''"policykit"'' (siehe auch Fehlerbericht https://bugs.launchpad.net/bugs/275432) == Fenster einer Anwendung öffnet sich nicht == Cron hat von Hause aus keinen Zugriff auf den Bildschirm. Cron ist in erster Linie für Server gedacht, die oftmals an gar keinen Bildschirm angeschlossen sind. Die Ausgabe der Kommandos wird auch nicht auf den Bildschirm geschrieben - das könnte auch sehr störend sein - sondern in Logdateien, bzw. in Mails, sofern eingerichtet, die an den User oder Administrator geschickt werden. Will man ausdrücklich ein Fenster öffnen, so muss man die Display-Variable setzen wie im zenity-Beispiel oben: ``DISPLAY=:0`` = Cronjobs über eine GUI bearbeiten = [[Bild(./gnome-schedule.png, 200, right)]] == GNOME == Für den GNOME-Desktop gibt es den [:GNOME_Schedule:GNOME Schedule], um auch Cronjobs über eine graphische Oberfläche verwalten zu können. Dieses Programm ist ab Dapper Drake in den Ubuntu-Quellen verfügbar. Man kann es über die Paketverwaltung mit dem Paket * '''gnome-schedule''' (''universe'', [3]) installieren und dann über * ''"Anwendungen -> Systemwerkzeuge -> Zeitgesteuerte Abläufe"'' starten. Weitere Informationen hält der Artikel zu [:GNOME_Schedule:GNOME Schedule] bereit. [[Bild(./kcron.png, 200, right)]] == KDE == Unter KDE gibt es für diese Aufgabe [http://www.kde.de/appmonth/2002/kcron/beschreibung.php KCron] {de} . Das Programm wird automatisch bei der Installation von Kubuntu mitinstalliert und findet sich unter * ''"K-Menü -> System -> KCron (Aufgabenplaner)"'' im Startmenü von KDE. = Links = * [:Shell/Umleitungen:Umleitungen] - Artikel über Umleitungen der Ausgabe von Shell-Befehlen * [http://www.linux-user.de/ausgabe/2006/02/094-zubefehl/index.html Cron, At] - Artikel aus LinuxUser 02/06 {de} * [http://www.hxpi.com/cron_sandbox.php http://www.hxpi.com/cron_sandbox.php] - Tool zum Testen einer Cronzeile, generiert Zeitpunkte, an denen das Kommando ausgeführt würde ---- # tag: System