bitlvl
DE

Cron-Spickzettel

Feldreihenfolge, die Zeitpläne, die man wirklich braucht, und die drei Fallen, die für die meisten „mein Cron-Job läuft nicht“-Tickets verantwortlich sind.

Passt auf eine A4-/Letter-Seite im Hochformat; mit „Als PDF speichern“ im Druckdialog behalten Sie eine Kopie.

Syntax

┌─ Minute (0–59)
│ ┌─ Stunde (0–23)
│ │ ┌─ Tag im Monat (1–31)
│ │ │ ┌─ Monat (1–12, jan–dec)
│ │ │ │ ┌─ Wochentag (0–7, sun–sat; 0 und 7 = Sonntag)
* * * * *  Befehl
*jeder Wert
5genau 5
1-5Bereich
*/15jeder 15.
1,15Liste
8-18/2Schritt im Bereich

Spezielle Strings

@rebooteinmal beim Start
@hourly0 * * * *
@daily / @midnight0 0 * * *
@weekly0 0 * * 0
@monthly0 0 1 * *
@yearly / @annually0 0 1 1 *

Zeitpläne

* * * * *jede Minute
*/5 * * * *alle 5 Minuten
*/15 9-17 * * 1-5alle 15 Min., Arbeitszeit, werktags
0 * * * *stündlich, zur vollen Stunde
30 * * * *stündlich um :30
0 */6 * * *alle 6 Stunden (0, 6, 12, 18)
0 0 * * *täglich um Mitternacht
0 3 * * *täglich um 03:00
30 6 * * 1-5werktags um 06:30
0 9,17 * * 1-5werktags um 09:00 und 17:00
0 0 * * 0sonntags um Mitternacht
0 0 * * 6,0Wochenenden
0 0 1 * *Monatserster
0 0 1,15 * *1. und 15.
0 0 1 */3 *quartalsweise (1. Jan, Apr, Jul, Okt)
0 0 1 1 *jährlich
0 0 * * 1#1erster Montag (nicht standard; nutzen Sie 0 0 1-7 * 1)
0 0 1-7 * 1erster Montag — Vorsicht: feuert an den Tagen 1–7 ODER an jedem Montag; Test [ $(date +\%u) = 1 ] ergänzen
0 0 28-31 * * [ $(date -d tomorrow +\%d) = 01 ] && cmdletzter Tag des Monats
0 2 * * * sleep $((RANDOM \% 1800)); cmd02:00 mit bis zu 30 Min. Streuung

Fallen

  • PATH ist minimal (/usr/bin:/bin). Absolute Pfade nutzen oder PATH=… oben in der crontab setzen.
  • % bedeutet im Befehl Zeilenumbruch; schreiben Sie \% (date +\%F).
  • Kein Shell-Profil: Aliase, nvm, rbenv, venvs werden nicht geladen.
  • Zeitzone ist die des Daemons (meist die des Systems, auf Servern oft UTC). CRON_TZ=Europe/Berlin funktioniert in cronie.
  • Tag im Monat UND Wochentag beide gesetzt = läuft, wenn eines passt.
  • Ausgabe wird gemailt an den Benutzer; umleiten oder MAILTO= setzen.
  • Überlappung: cron startet den Job erneut, auch wenn der letzte noch läuft. In flock -n /tmp/job.lock cmd einhüllen.

Befehle

crontab -eeigene crontab bearbeiten
crontab -lauflisten
crontab -ralles entfernen (ohne Rückfrage!)
crontab -u www-data -ldie eines anderen Benutzers (root)
/etc/crontab, /etc/cron.d/*System-crontabs: haben ein Benutzerfeld nach dem Zeitplan
/etc/cron.{hourly,daily,weekly,monthly}/Drop-in-Skripte, auf Desktops von anacron ausgeführt
grep CRON /var/log/syslog; journalctl -u cronsehen, was lief

Eine sichere Vorlage

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
[email protected]
SHELL=/bin/bash
# m h dom mon dow  Befehl
30 6 * * 1-5  flock -n /run/backup.lock /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

Die Ergebnisse und Meldungen dieses Tools werden auf Englisch angezeigt.

Fragen

Wie prüfe ich, was ein Cron-Ausdruck bedeutet?

Fügen Sie ihn in den Cron-Erklärer ein; er gibt den Zeitplan in Klartext und die nächsten zehn Läufe in Ihrer Zeitzone aus.