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:
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:
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 2024-09-30