cron

Siehe auch

Um die Tabelle zu bearbeiten, verwendet man das crontab-Kommando. crontab -l listet alle vorhandenen Cronjobs auf, crontab -e editiert die Tabelle des aktuellen Benutzers. Man beachte, dass Cronjobs minimal minütlich laufen können.

Eine cron-Tabelle ist immer wie folgt aufgebaut:

minute hour  day-of-month  month  day-of-week       command-to-be-executed
0-59   0-23  1-31          1-12   0 (sun), 6 (sat)
                           jan

Cronjobs lassen sich auch in /etc/cron.d/<beliebiger-filename> ablegen. Dann haben sie das Format

minute hour  day-of-month  month  day-of-week       username command-to-be-executed

Unterhalb von

  • cron.monthly/

  • cron.weekly/

  • cron.daily/

  • cron.hourly/

dürfen Bash-Dateien liegen, die Dateinamensortierung ist gleichzeitig Abarbeitungsreihenfolge.

Folgende Zeichen müssen in einem Cronjob mit einem Backslash (\) maskiert / gequotet / escaped werden:

%

Um die Crontab eines anderen Benutzers zu bearbeiten, verwendet man

crontab -u apache -e

Neben expliziten Zeitangaben ist auch folgendes möglich:

@annually
@daily
@hourly
@monthly
@reboot     # Wird als erstes nach einem Reboot ausgeführt
@weekly
@yearly

Wenn mehr als ein Befehl pro Job ausgeführt werden soll, hängt man sie per Semikolon oder && zusammen. Der Unterschied: der Befehl nach einem ; wird immer ausgeführt, egal ob der vorherige Befehl erfolgreich ausgeführt werden konnte. Der Befehl nach einem && wird nur ausgeführt, wenn der vorherige Befehl erfolgreich ausgeführt werden konnte.

47 13 * * mon-fri    cmd 1; cmd 2; cmd 3
48 13 * * mon-fri    cmd 1 && cmd 2 && cmd 3

Mail-Benachrichtigung konfigurieren - Beispiele:

/etc/crontab
MAILTO=root
MAILTO=linus@linuxfabrik.ch
MAILTO=""

Cronjob wird nicht ausgeführt? Meist liegt es schlicht und einfach an einer falschen Uhrzeit auf dem System.

Es gibt übrigens keine durch cron gegebene Möglichkeit, sich eine zusammengefasste Übersicht über alle anstehenden oder zurückliegenden Cronjobs ausgeben zu lassen. Das bietet systemd-timer.

Security

So verhindert man, dass der Benutzer linus einen Cronjob anlegen darf:

/etc/cron.deny
linus

Test:

su - linus
crontab -e
You (linus) are not allowed to use this program (crontab)

cron Cheat Sheet

Task einmal täglich ausführen (meist gegen 0:00 Uhr):

@daily cmd

Wochentags um 13:47 Uhr:

47 13 * * mon-fri cmd

Alle 6 Minuten zwischen 14:00 und 14:59 Uhr, JEDEN Sonntag („dec“ wird ignoriert; erster Aufruf beginnt um 14:00:00):

*/6 14 * dec sun cmd

Tipp

*/3 bedeutet 0, 3, 6, 9, …, */6 bedeutet 0, 6, 12 etc.

Kommando einmal am Tag ausführen, aber Ausführung zufallsmässig um bis zu 600 Sekunden hinauszögern:

@daily sleep $(( $RANDOM \% 600)); cmd

Immer am ersten Mittwoch eines Monats:

30 08 1-7 * * [ "$(date +\%a)" = "Wed" ] && cmd

Bemerkung

30 08 1-7 * Wed cmd wäre intuitiv, aber falsch. Die Anweisung bedeutet: der Job läuft am 01. bis 07. eines Monats als auch jeden Mittwoch. Grund: sobald „Day of month“ und „Day of week“ mit Werten statt mit „*“ gefüllt sind, werden die Angaben mit „ODER“ verknüpft.

Immer um 23:50 Uhr am letzten Tag / Ende eines jeden Monats:

50 23 28-31 * * [ $(date --date +1day +\%d) -eq 1 ] && cmd

Bemerkung

Die Anweisung [ $(date --date +1day +\%d) -eq 1 ] && cmd... führt cmd nur aus, wenn heute plus ein Tag gleich eins ist - wenn morgen also der Erste ist. Aufgerufen an den möglichen letzten Tagen eines Monats sorgt das verkürzte if dafür, dass cmd genau am letzten Tag des Monats ausgeführt wird.

So fügt ein Shell-Script einen Cron-Job hinzu:

echo "@daily yum -y update 1> /dev/null" >> /var/spool/cron/root

Built on 2022-06-03