Das Linux Cron Cheatsheet
Sie haben Ihre Node-App auf einem Linux-Server bereitgestellt und benötigen ein Skript, das jede Nacht um 3 Uhr morgens ausgeführt wird. Sie haben von Cron gehört, aber die Syntax sieht kryptisch aus und die Tutorials, die Sie gefunden haben, sind entweder veraltet oder voller Ungenauigkeiten. Dieses Linux Cron Cheatsheet bietet Ihnen die korrekte, distributionsspezifische Referenz, die Sie für eine zuverlässige Cron-Job-Planung benötigen.
Wichtigste Erkenntnisse
- Cron verwendet ein Fünf-Felder-Format (Minute, Stunde, Tag des Monats, Monat, Wochentag), gefolgt vom auszuführenden Befehl.
- Wenn sowohl Tag-des-Monats als auch Wochentag angegeben sind, behandelt Cron diese als ODER, nicht UND – eine häufige Quelle für unerwartetes Verhalten.
- Cron läuft mit einer eingeschränkten, distributionsabhängigen Umgebung, daher sollten Sie immer absolute Pfade verwenden und PATH explizit für Portabilität setzen.
- Verschiedene Linux-Distributionen verwenden unterschiedliche Cron-Implementierungen mit variierender Feature-Unterstützung.
Crontab-Syntax: Das Fünf-Felder-Format
Jeder Cron-Job folgt dieser Struktur:
┌───────────── Minute (0-59)
│ ┌─────────── Stunde (0-23)
│ │ ┌───────── Tag des Monats (1-31)
│ │ │ ┌─────── Monat (1-12)
│ │ │ │ ┌───── Wochentag (0-6, Sonntag=0)
│ │ │ │ │
* * * * * Befehl
Sonderzeichen:
*— beliebiger Wert,— Listentrennzeichen (1,3,5)-— Bereich (1-5)/— Schrittwerte (*/15 bedeutet alle 15)
Wichtig: Zeichen wie L, W, # und ? gehören zur Quartz-Scheduler-Syntax, nicht zum Standard-Cron. Verwenden Sie diese nicht in Linux-Crontabs. Im Zweifelsfall prüfen Sie die Dokumentation Ihres Systems über man 5 crontab.
Häufige Planungsmuster
*/5 * * * * # Alle 5 Minuten
0 * * * * # Zu jeder vollen Stunde
0 3 * * * # Täglich um 3 Uhr morgens
0 0 * * 0 # Wöchentlich sonntags um Mitternacht
0 0 1 * * # Erster Tag jedes Monats
Spezielle Zeichenketten
Die meisten Cron-Implementierungen unterstützen diese Abkürzungen (die Unterstützung kann bei minimalen Systemen wie BusyBox variieren):
| Zeichenkette | Entsprechung |
|---|---|
@reboot | Einmalig beim Start |
@hourly | 0 * * * * |
@daily | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly | 0 0 1 1 * |
Beachten Sie, dass @reboot nicht garantiert, dass Netzwerk oder andere Dienste verfügbar sind; für abhängigkeitsbewusste Startup-Jobs sind systemd-Timer normalerweise die bessere Wahl.
Die Falle: Tag-des-Monats vs. Wochentag
Wenn Sie sowohl Tag-des-Monats ALS AUCH Wochentag angeben, behandelt Cron diese als ODER, nicht UND:
0 0 15 * 1 # Läuft am 15. ODER an jedem Montag
Das überrascht viele Benutzer. Wenn Sie „den 15., aber nur wenn es ein Montag ist” benötigen, behandeln Sie diese Logik innerhalb Ihres Skripts.
Umgebungsvariablen-Handling
Cron läuft mit einer eingeschränkten, nicht-interaktiven Umgebung. Hier scheitern die meisten Jobs stillschweigend.
PATH-Verhalten variiert je nach Distribution und Version:
- Einige Systeme definieren einen minimalen Standard-PATH
- Andere (insbesondere neuere Ubuntu-Releases) können PATH aus der Service-Umgebung erben
Verlassen Sie sich nicht auf Standardwerte. Für portables und vorhersagbares Verhalten setzen Sie explizit, was Sie benötigen.
Sichere Praktiken:
# Setzen Sie Variablen am Anfang Ihrer Crontab
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
MAILTO=""
# Verwenden Sie immer absolute Pfade
0 3 * * * /usr/bin/node /home/deploy/app/cleanup.js
Hinweis: MAILTO funktioniert nur, wenn ein lokaler MTA installiert und konfiguriert ist. Viele moderne Server haben keinen. Leiten Sie die Ausgabe stattdessen explizit um, anstatt sich auf E-Mail zu verlassen.
Discover how at OpenReplay.com.
Ausgabe und Protokollierung
# Alles protokollieren
0 3 * * * /path/to/script.sh >> /var/log/myjob.log 2>&1
# Alle Ausgaben verwerfen
0 3 * * * /path/to/script.sh >/dev/null 2>&1
# Nur Fehler protokollieren
0 3 * * * /path/to/script.sh >/dev/null 2>> /var/log/myjob-errors.log
Wichtige Crontab-Befehle
crontab -e # Crontab bearbeiten
crontab -l # Aktuelle Jobs auflisten
crontab -r # Alle Jobs entfernen (Vorsicht!)
Für systemweite Jobs verwenden Sie Dateien in /etc/cron.d/. Beachten Sie, dass /etc/cron.daily/, /etc/cron.hourly/ usw. über run-parts ausgeführt werden und nicht automatisch von Cron gescannt werden. Siehe man 8 run-parts für Benennungs- und Ausführungsregeln.
Cron-Implementierungen variieren
Verschiedene Systeme verwenden unterschiedliche Cron-Daemons:
- Debian/Ubuntu: cron (Vixie-Abstammung, distributionsspezifisch gepatcht)
- RHEL/Fedora: Cronie
- Alpine/Container: BusyBox
crond
Feature-Unterstützung (spezielle Zeichenketten, Mail-Verhalten, Protokollierung) kann sich unterscheiden. Prüfen Sie immer gegen Ihre lokale crontab(5) Manual-Page.
Cron vs. Systemd-Timer
| Aspekt | Cron | Systemd-Timer |
|---|---|---|
| Setup-Komplexität | Einfach | Ausführlicher |
| Verpasste Jobs | Übersprungen | Konfigurierbar (Persistent=true) |
| Abhängigkeiten | Keine | Kann auf Services/Mounts warten |
| Protokollierung | Manuell | Integriert in journald |
Verwenden Sie Cron, wenn: Sie einfache, portable Planung benötigen, die überall funktioniert.
Verwenden Sie systemd-Timer, wenn: Sie Abhängigkeitsverwaltung, persistente Planung über Neustarts hinweg oder bessere Integration mit modernen Linux-Systemen benötigen. Die systemd-Projektdokumentation zu Timer-Units ist die maßgebliche Referenz.
Schnelle Debugging-Checkliste
- Läuft Cron?
systemctl status cronodersystemctl status crond(Service-Name variiert je nach Distribution) - Logs prüfen:
grep CRON /var/log/syslog(Debian/Ubuntu) oder/var/log/cron(RHEL/Fedora) - Testen Sie Ihren Befehl manuell mit einer eingeschränkten Umgebung
- Überprüfen Sie absolute Pfade für alle Befehle und Dateien
- Prüfen Sie Dateiberechtigungen auf Ihrem Skript
Fazit
Cron bleibt die einfachste Methode, um Jobs unter Linux zu planen. Beherrschen Sie die Fünf-Felder-Syntax, verstehen Sie das ODER-Verhalten beim Kombinieren von Tag-Feldern und berücksichtigen Sie distributionsspezifisches Umgebungsverhalten. Mit diesen Grundlagen werden Ihre geplanten Aufgaben jahrelang zuverlässig laufen.
FAQs
Die häufigste Ursache sind Umgebungsprobleme. Cron läuft mit einer eingeschränkten, nicht-interaktiven Umgebung, die sich von Ihrer Shell unterscheidet, und das PATH-Verhalten variiert je nach Distribution. Verwenden Sie immer absolute Pfade, setzen Sie erforderliche Variablen explizit, überprüfen Sie, ob der Cron-Service läuft, und prüfen Sie die System-Logs auf Fehler.
Verwenden Sie das Wochentag-Feld mit einem Bereich von Montag (1) bis Freitag (5). Um beispielsweise jeden Wochentag um 9 Uhr morgens auszuführen, verwenden Sie: 0 9 * * 1-5 /path/to/script.sh. Beachten Sie, dass Sonntag 0 und Samstag 6 in der Standard-Cron-Syntax ist.
Benutzer-Crontabs werden mit crontab -e bearbeitet und pro Benutzer gespeichert. System-Crontabs in /etc/cron.d/ enthalten ein zusätzliches Benutzername-Feld nach der Zeitangabe, um anzugeben, welcher Benutzer den Befehl ausführt. System-Crontabs eignen sich besser für Dienste und gemeinsame Administration.
Führen Sie Ihren Befehl manuell in einer minimalen Umgebung aus, die Cron nachahmt. Zum Beispiel: env -i PATH=/usr/bin:/bin /path/to/script.sh. Dies hilft, fehlende Abhängigkeiten oder Pfadprobleme aufzudecken, die sonst zu stillen Fehlern führen würden.
Gain control over your UX
See how users are using your site as if you were sitting next to them, learn and iterate faster with OpenReplay. — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.