cron & Timer
Prozesse & System
Aufgaben automatisch ausführen
Viele Aufgaben sollen regelmäßig laufen, ohne dass du sie von Hand startest: nächtliche Backups, das Aufräumen von Logdateien oder das Abrufen von E-Mails. Dafür gibt es unter Linux den klassischen cron-Dienst sowie die modernen systemd-Timer. Cron ist seit Jahrzehnten Standard, einfach und auf nahezu jedem System verfügbar.
Die crontab bearbeiten
Jeder Nutzer hat seine eigene crontab (cron table) – eine Liste geplanter Aufgaben. Du bearbeitest sie mit:
$ crontab -e # eigene crontab bearbeiten $ crontab -l # eigene crontab anzeigen $ crontab -r # crontab löschen (Vorsicht!)
Verwende immer crontab -e statt die Datei direkt zu editieren – so wird die Syntax geprüft und der Dienst neu eingelesen.
Die fünf Zeitfelder
Jede Zeile besteht aus fünf Zeitfeldern und dem auszuführenden Befehl. Die Reihenfolge ist: Minute, Stunde, Tag des Monats, Monat, Wochentag.
# ┌── Minute (0-59) # │ ┌── Stunde (0-23) # │ │ ┌── Tag des Monats (1-31) # │ │ │ ┌── Monat (1-12) # │ │ │ │ ┌── Wochentag (0-7, 0 und 7 = Sonntag) # │ │ │ │ │ 30 2 * * * /usr/local/bin/backup.sh
Dieses Beispiel läuft jeden Tag um 2:30 Uhr. Das Sternchen * bedeutet „jeder Wert“. Weitere Beispiele:
| Eintrag | Bedeutung |
|---|---|
0 * * * * | jede Stunde zur vollen Minute 0 |
*/15 * * * * | alle 15 Minuten |
0 9 * * 1-5 | werktags um 9 Uhr |
0 0 1 * * | am 1. jedes Monats um Mitternacht |
Die Cron-Syntax lässt sich leicht verrechnen – nutze zum Prüfen unseren Cron-Rechner.
Spezielle Zeitangaben
Neben den fünf Feldern gibt es bequeme Abkürzungen. Besonders nützlich ist @reboot, das einen Befehl einmal nach jedem Systemstart ausführt:
@reboot /opt/app/start.sh @daily /usr/local/bin/cleanup.sh @hourly /usr/local/bin/sync.sh
systemd-Timer als Alternative
Auf systemd-Systemen kannst du statt cron auch Timer nutzen. Sie bestehen aus einer .timer- und einer .service-Unit, lassen sich mit journalctl protokollieren und holen verpasste Termine nach (Persistent=true).
[Timer] OnCalendar=*-*-* 02:30:00 Persistent=true [Install] WantedBy=timers.target
# systemctl enable --now backup.timer $ systemctl list-timers
Mehr zu Units findest du unter systemd & Dienste.
Stolperfallen & Sicherheit
Der größte Klassiker: Cron-Jobs laufen mit einer minimalen Umgebung. Die Variable PATH ist sehr kurz, deshalb solltest du absolute Pfade verwenden (z. B. /usr/bin/python3 statt nur python3). Leite die Ausgabe in eine Logdatei um, um Fehler zu sehen: ... >> /var/log/mein.log 2>&1. Mehr zu Pfaden unter Umgebungsvariablen & PATH. Aus Sicherheitssicht gilt: Skripte, die per cron als root laufen, sollten nur für root schreibbar sein – sonst kann ein anderer Nutzer den Inhalt ändern und so root-Rechte erlangen.