Benutzer-Werkzeuge

Webseiten-Werkzeuge


Seitenleiste

Was fehlt?

Es liegt in der Natur der Sache: Ein Wiki ist niemals fertig. Wir geben uns große Mühe, mit der Entwicklung Schritt zu halten; lassen Supportanfragen direkt in neue Artikel einfließen … aber auch wir sind nicht perfekt. Wenn du hier nicht fündig wirst: Nicht schmollen - Bescheid sagen! Unter hallo@uberspace.de steht dir unser Team gerne bereit. Hand drauf!

system:cron

Cronjobs

Cronjobs dienen dazu, wie der Name schon sagt, Prozesse zu bestimmten Zeiten auszuführen. Cronjobs werden in einer Art Tabelle, der sogenannten crontab abgelegt wo sie von dir angelegt, eingesehen, editiert oder auch gelöscht werden können. Als Werkzeug benötigst du hier den Befehl crontab.

Der Aufbau dieser Tabelle (welche in Wirklichkeit auch nur eine einfache Textdatei ist) sieht vor, das es pro Job einen Eintrag gibt der festlegt wann dieser Job laufen soll und wie der Job aufgerufen wird. Ein Eintrag besteht aus mehreren Spalten die durch Leerzeichen voneinander getrennt werden. Die ersten fünf Spalten enthalten die Angabe der Zeit wann der Job ausgeführt werden soll und die letzte Spalte enthält den Befehl bzw. das Kommando das den Job anstößt.

Wichtig ist für dich das alle cronjobs mit den Rechten deines Uberspace-Users laufen!

Aufbau der crontab

* * * * *     /pfad/zum/job
┬ ┬ ┬ ┬ ┬
│ │ │ │ │
│ │ │ │ └──── Wochentag (0-7) (wobei Sonntag 0 oder 7 sein kann)
│ │ │ └────── Monat (1-12)
│ │ └──────── Tag des Monats (1-31)
│ └────────── Stunde (0-23)
└──────────── Minute (0-59)

Ein * in einer Spalte bedeutet so viel, das hier jeder Wert dieser Spalte gültig ist. Der cron schickt übrigens bei jedem Aufruf eines Jobs jegliche Ausgaben die dein Job generiert an deinen Uberspaceuser. Dein Job bzw. das Script was du aufrufen möchtest kann natürlich noch mehrere Parameter oder Umleitungen der Standard- und Standardfehlerausgabe beinhalten. Vielleicht helfen dir folgende Beispiele zu verstehen was damit gemeint ist.

Einfache Beispiele:

15 * * * * /pfad/zum/job/script.pl

Der Job /pfad/zum/job/script.pl wird 15 Minuten nach jeder vollen Stunde angestoßen.

30 10 * * * /pfad/zum/job/script.pl

Der Job /pfad/zum/job/script.pl wird jeden Tag um 10:30 Uhr angestoßen.

* * * * * /pfad/zum/job/script.pl

Der Job /pfad/zum/job/script.pl wird jede Minute angestoßen.

15 20 * * * /pfad/zum/job/script.pl >/dev/null 2>&1

Das Script wird ausgeführt, leitet aber alle Ausgaben die an die Standardfehlerausgabe und Standardausgabe gehen nach /dev/null um - sie werden also gelöscht.

15 20 * * * /pfad/zum/job/script.pl param1 paran2

Das Script wird ausgeführt und bekommt die Parameter „param1“ und „param2“ übergeben.

Spezielle Funktionen durch die Sonderzeichen „/“, „,“ und „-„

  • Das Zeichen “/“ teilt eine Zeitangabe
  • Das zeichen „,“ kombiniert mehrere Angaben (Oder-Funktion)
  • Das Zeichen „-“ legt einen Zeitraum fest (von - bis)

Auch hier wieder ein paar Beispiele:

*/5 * * * * /pfad/zum/job/script.pl

Der Job /pfad/zum/job/script.pl wird alle 5 Minuten angestoßen.

30 8-20 * * * /pfad/zum/job/script.pl

Der Job wird zwischen 8:00 und 20:00 Uhr zur jeder halben Stunde angestoßen.

30 10 * * 1,2,3,4,5 /pfad/zum/job/script.pl

Der Job wird Wochentags (Montag bis Freitag) um 10:30 Uhr angestoßen.

Aliase

Es gibt auch für einige fest definierte Zeitpunkte Aliase die du verwenden kannst. Diese wären hier:

@hourly Zur vollen Stunde (also: 0 * * * *)
@daily oder @midnight Einmal am Tag (also: 0 0 * * *)
@weekly Einmal pro Woche (also: 0 0 * * 0)
@monthly Einmal pro Monat (also: 0 0 1 * *)
@yearly oder @annually Einmal im Jahr (also: 0 0 1 1 *)
@reboot Nach dem booten des Systems

Umgebungsvariablen der crontab

Du kannst auch einige Umgebungsvariablen in der crontab setzen die dir helfen den Job so auszuführen das er z.B. Ausgaben (Meldungen) an einen fest definierten Empfänger versendet, eine Pfad setzt der in der Umgebungsvariablen $PATH noch nicht existiert oder auch eine Shell definiert.

PATH

Hier kannst du festlegen in welchen Verzeichnissen (Pfaden) cron nach deinem Job suchen soll. Default ist „/usr/bin:/bin“. Du musst aber aufpassen denn das setzen von der Umgebungsvariablen PATH überschreibt die derzeitige Variable $PATH. Wenn du also möchtest das der cron auch den Pfad /home/<DeinVerzeichnis>/bin in der Umgebungsvariablen $PATH hat, dann musst du PATH neu und vor allen Dingen vollständig definieren:

PATH=/home/<DeinVerzeichnis>/bin:/usr/bin:/bin

MAILTO

Falls du wünschst, das Cron Nachrichten für einen bestimmten Job an eine andere E-Mail-Adresse schickt und nicht an deinen Uberspace, dann kannst du dieses hier festlegen.

Beispiel:

*/5 * * * * script1.pl
10 20 * * * script2.pl
MAILTO="info@meinedomain.tld"
10 20 * * * script3.pl

Du kannst auch mehrere Adressen angeben, wenn du sie durch jeweils ein Komma von einander trennst.

Mails abstellen

Falls du die E-Mails von Cron unterdrücken willst, kannst du die Variable MAILTO auf einen leeren Wert setzen. Fehlermeldungen aus der STDERR-Ausgabe des Scripts bekommst du weiterhin.

*/5 * * * * script1.pl
10 20 * * * script2.pl
MAILTO=""
10 20 * * * script3.pl

Um gar keine Mitteilungen über irgendetwas zu bekommen, also auch nicht über Fehler, leite die Ausgaben allesamt ins Nirvana um:

*/5 * * * * script1.pl > /dev/null 2>&1

Und schon gibt Cron Ruhe!

CONTENT_TYPE

Die Mails, die Cron verschickt, tragen normalerweise das Default-Charset des Systems, was auf US-ASCII (aka ANSI_x3.4-1968) steht. Möchtest du, dass für die Inhalte der von Cron verschickten Mails UTF-8 als Zeichensatz verwendet wird, so kannst du das so realisieren:

CONTENT_TYPE="text/plain; charset=utf-8"

Danke an rbq für den Hinweis!

SHELL

Hier kannst Du festlegen in welcher Shell dein Job ausgeführt werden soll. Default ist /bin/sh und in der Regel muss diese Variable auch nicht angepasst werden.

Script-spezifische Umgebungsvariablen

Cron liefert dir ein minimales Environment, das ggf. von dem, das du auf einer interaktiven Shell hast, abweicht. Wenn dein Script bestimmte Umgebungsvariablen benötigt, musst du jene insofern selbst setzen. Braucht dein Script z.B. UTF-8 als Ausgabesprache, kannst du LANG=en_US.UTF-8 setzen.

So, nun aber los...

Crontab anzeigen lassen

Um dir deine derzeitigen cronjobs anzeigen zu lassen benutzt du das Kommando crontab -l was dir wahrscheinlich bei der ersten Anwendung nichts ausgeben wird.

Crontab editieren / bearbeiten

Um deine crontab zu editieren oder einen neuen job anzulegen nutze einfach das Kommando crontab -e (wenn Du noch keine hast, wird automatisch eine crontab für Dich erstellt). Du kannst durch Setzen der Umgebungsvariable VISUAL einstellen, mit welchem Editor du deine Crontab bearbeiten möchtest (welcher das standardmäßig ist, kann sich zwischen den Hosts unterscheiden):

export VISUAL='nano -w'

oder auch

export VISUAL='vi'

Die Einstellung gilt nur während deiner laufenden SSH-Sitzung. Möchtest du sie dauerhaft vornehmen, editiere die Datei bzw. die Konfiguration .bash_profile in deinem Home-Verzeichnis und füge obige Zeile einfach am Ende an. Ab dem nächsten Login nutzt das Kommando crontab immer den von dir gewünschten Editor.

Cronjob einrichten

Wie schon erwähnt fügst du für einen neuen bzw. zusätzlichen Cronjob einfach eine neue Zeile (Bearbeiten durch crontab -e) in deine crontab ein

Cronjob löschen

Um einen Cronjob zu löschen reicht es aus die jeweilige Zeile (Bearbeiten durch crontab -e) einfach zu entfernen.

Crontab / Änderungen speichern

Nach dem editieren speicherst du die crontab einfach im Editor ab (im vi durch :wq und im nano/pico durch 'Strg + x' mit anschließendem Bestätigen y). Danach wird deine Änderung quitiert und die neue crontab ist ab sofort aktiv. Dir sollte zur Kontrolle folgende Bestätigung angezeigt werden:

crontab: installing new crontab

Mehr ist an dieser Stelle nicht zu tun.

Ups, ein Fehler

Solltest du einmal einen Fehler in deine crontab gebaut haben (wahrscheinlich nicht beabsichtigt), dann bekommst du diesen Fehler beim Abspeichern angezeigt und hast die Möglichkeit die crontab zu überarbeiten oder das editieren lieber zu verschieben. Beispiel mit folgender crontab:

# Mein erster Cronjob
30 11 * * * /alter_cronjob.sh
# Mein neuer Cronjob
30 10 * * /neu_angelegter_cronjob.sh

Wenn ich diese crontab jetzt im Editor speicher, erhalte ich auf Grund des Fehlers eine Meldung ausgegeben und die derzeitige crontab wird nicht überschrieben:

crontab: installing new crontab
"/tmp/crontab.XXXXqaI14E":2: bad day-of-week
errors in crontab file, can't install.
Do you want to retry the same edit? **y**

Hier stimmt wohl etwas nicht bei der Angabe der Zeit. Es kann ja mal vorkommen das du mal eine Spalte in der Zeitangabe vergessen oder eine Spalte zu viel eingebaut hast. Dann solltest du dir noch einmal den Aufbau anschauen. Im obigen Beispiel wurde die Frage Do you want to retry the same edit? mit y beantwortet und die crontab wurde wieder zum editieren geöffnet. Für den Fall das du den Versuch die crontab zu editieren lieber anbrechen möchtest antwortest du einfach mit n und die bisherige crontab bleibt einfach unangepasst weiter gültig:

Do you want to retry the same edit? **n**
crontab: edits left in /tmp/crontab.XXXXqaI14E
[boni@xeon ~]$

Zusätzlich prüfen ob die crontab sich geändert hat, was aber nicht der Fall ist:

[boni@xeon ~]$ crontab -l
# Mein erster Cronjob
30 10 * * * /myscript.sh
[boni@xeon ~]$ 
system/cron.txt · Zuletzt geändert: 2015/11/18 18:07 von uber