Cron ist der Standard-Taskplaner unter Linux. Er führt Befehle und Skripte zu festgelegten Zeiten automatisch aus - ideal für Backups, Wartung und wiederkehrende Aufgaben.
Cron-Syntax
Crontab-Format
┌───────────── Minute (0-59)
│ ┌───────────── Stunde (0-23)
│ │ ┌───────────── Tag des Monats (1-31)
│ │ │ ┌───────────── Monat (1-12)
│ │ │ │ ┌───────────── Wochentag (0-7, 0 und 7 = Sonntag)
│ │ │ │ │
* * * * * BefehlSpezialzeichen
| Zeichen | Bedeutung | |---------|-----------| | | Jeder Wert | | , | Liste (1,3,5) | | - | Bereich (1-5) | | / | Schrittweite (/15) |
Vordefinierte Zeitangaben
| Kürzel | Entspricht | |--------|------------| | @reboot | Beim Systemstart | | @yearly | 0 0 1 1 | | @monthly | 0 0 1 | | @weekly | 0 0 0 | | @daily | 0 0 | | @hourly | 0 |
Crontab verwalten
Benutzer-Crontab
# Crontab bearbeiten
crontab -e
# Crontab anzeigen
crontab -l
# Crontab löschen
crontab -r
# Crontab eines anderen Users (root)
crontab -u username -eSystem-Crontabs
# /etc/crontab - System-weite Crontab
# /etc/cron.d/ - Zusätzliche Crontabs
# /etc/cron.daily/ - Tägliche Scripts
# /etc/cron.hourly/ - Stündliche Scripts
# /etc/cron.weekly/ - Wöchentliche Scripts
# /etc/cron.monthly/ - Monatliche ScriptsBeispiele
Zeitpläne
# Jede Minute
* * * * * /path/to/script.sh
# Alle 5 Minuten
*/5 * * * * /path/to/script.sh
# Stündlich um :30
30 * * * * /path/to/script.sh
# Täglich um 3:00
0 3 * * * /path/to/script.sh
# Montags um 9:00
0 9 * * 1 /path/to/script.sh
# Jeden 1. des Monats um 0:00
0 0 1 * * /path/to/script.sh
# Werktags (Mo-Fr) um 8:00
0 8 * * 1-5 /path/to/script.sh
# Alle 15 Minuten während Arbeitszeit
*/15 8-17 * * 1-5 /path/to/script.shPraktische Jobs
# Backup täglich um 2:00
0 2 * * * /usr/local/bin/backup.sh
# Log-Rotation wöchentlich
0 0 * * 0 /usr/sbin/logrotate /etc/logrotate.conf
# SSL-Zertifikate erneuern (2x täglich)
0 0,12 * * * certbot renew --quiet
# Datenbank-Dump täglich
0 3 * * * mysqldump -u root mydb > /backup/mydb-$(date +\%Y\%m\%d).sql
# Temp-Dateien aufräumen
0 4 * * * find /tmp -type f -mtime +7 -delete
# System-Update (Debian)
0 5 * * 0 apt update && apt upgrade -yAusgabe und Logging
Mail-Benachrichtigung
# Mail-Empfänger setzen
MAILTO=admin@example.de
# Keine Mail
MAILTO=""
# Job mit spezifischer Mail
0 3 * * * /backup.sh 2>&1 | mail -s "Backup Report" admin@example.deIn Datei loggen
# stdout und stderr
0 3 * * * /backup.sh >> /var/log/backup.log 2>&1
# Mit Timestamp
0 3 * * * echo "$(date): Starting backup" >> /var/log/backup.log && /backup.sh >> /var/log/backup.log 2>&1
# Nur Fehler
0 3 * * * /backup.sh >> /dev/null 2>> /var/log/backup-errors.logKeine Ausgabe
0 3 * * * /backup.sh > /dev/null 2>&1Umgebungsvariablen
In Crontab setzen
# Am Anfang der Crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
MAILTO=admin@example.de
# Jobs
0 3 * * * /backup.shIm Script laden
#!/bin/bash
# /usr/local/bin/backup.sh
# Umgebung laden
source /etc/environment
source ~/.bashrc
# Oder explizit
export PATH=/usr/local/bin:$PATH
export LANG=de_DE.UTF-8
# Rest des ScriptsCron-Verzeichnisse
/etc/cron.d/
# /etc/cron.d/myapp
# Format: wie /etc/crontab mit User-Feld
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
*/5 * * * * www-data /var/www/myapp/cron.php
0 3 * * * root /usr/local/bin/myapp-backup.sh/etc/cron.daily/
#!/bin/bash
# /etc/cron.daily/cleanup
# Keine Zeitangabe nötig - wird täglich ausgeführt
find /var/log -name "*.log" -mtime +30 -deletechmod +x /etc/cron.daily/cleanupBest Practices
Locking (Keine Überlappung)
#!/bin/bash
# Mit flock
LOCKFILE=/var/run/backup.lock
exec 200>$LOCKFILE
flock -n 200 || exit 1
# Backup-Code hier
/backup/script.sh# In Crontab mit flock
0 3 * * * flock -n /var/run/backup.lock /backup.shFehlerbehandlung
#!/bin/bash
set -e # Bei Fehler abbrechen
# Oder mit Trap
trap 'echo "Fehler in Zeile $LINENO" | mail -s "Cron Error" admin@example.de' ERR
# Script
/backup/run.shTimeout
# Job nach 1 Stunde abbrechen
0 3 * * * timeout 3600 /long-running-script.shPriorisierung
# Mit nice (niedrige Priorität)
0 3 * * * nice -n 19 /backup.sh
# Mit ionice (I/O Priorität)
0 3 * * * ionice -c3 nice -n 19 /backup.shSystemd Timer (Alternative)
Timer-Unit
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 03:00:00
Persistent=true
RandomizedDelaySec=300
[Install]
WantedBy=timers.targetService-Unit
# /etc/systemd/system/backup.service
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh
User=rootAktivieren
systemctl daemon-reload
systemctl enable backup.timer
systemctl start backup.timer
# Status
systemctl list-timers
systemctl status backup.timerVorteile von Systemd Timern
| Feature | Cron | Systemd Timer | |---------|------|---------------| | Logging | Manuell | Journald integriert | | Dependencies | Nein | Ja | | Randomized Delay | Nein | Ja | | Persistent | Nein | Ja (nachholen) | | Resource Limits | Nein | Ja |
Troubleshooting
Cron läuft nicht
# Service prüfen
systemctl status cron
# Logs prüfen
grep CRON /var/log/syslog
journalctl -u cron
# Berechtigungen
ls -la /usr/local/bin/script.shScript funktioniert manuell aber nicht in Cron
# 1. Vollständige Pfade verwenden
/usr/bin/php /var/www/script.php
# 2. PATH setzen
PATH=/usr/local/bin:/usr/bin:/bin
# 3. Arbeitsverzeichnis
cd /var/www && ./script.sh
# 4. Umgebung laden
source /etc/profile && /script.shDebug-Modus
# Test-Job
* * * * * env > /tmp/cron-env.txt 2>&1
# Prüfen
cat /tmp/cron-env.txtZusammenfassung
| Syntax | Beispiel | Bedeutung | |--------|----------|-----------| | | Jede Minute | | | 0 | 0 | Jede Stunde | | 0 3 | 0 3 | Täglich 3:00 | | 0 3 0 | 0 3 0 | Sonntags 3:00 | | /5 | /5 * | Alle 5 Min |
| Befehl | Funktion | |--------|----------| | crontab -e | Bearbeiten | | crontab -l | Anzeigen | | crontab -r | Löschen |
| Verzeichnis | Ausführung | |-------------|------------| | /etc/cron.hourly | Stündlich | | /etc/cron.daily | Täglich | | /etc/cron.weekly | Wöchentlich | | /etc/cron.monthly | Monatlich |
Fazit
Cron ist unverzichtbar für automatisierte Serveraufgaben. Die einfache Syntax ermöglicht präzise Zeitplanung. Logging und Fehlerbehandlung sollten immer implementiert werden. File-Locking verhindert parallele Ausführungen. Für komplexere Anforderungen bieten Systemd Timer zusätzliche Features wie Dependencies und integriertes Logging.