Cron ist der Standard-Taskplaner unter Linux. Mit Cronjobs automatisieren Sie wiederkehrende Aufgaben wie Backups, Log-Rotation und Wartungsskripte.
Cron-Grundlagen
Wie Cron funktioniert
┌───────────── Minute (0-59)
│ ┌───────────── Stunde (0-23)
│ │ ┌───────────── Tag des Monats (1-31)
│ │ │ ┌───────────── Monat (1-12)
│ │ │ │ ┌───────────── Wochentag (0-7, 0 und 7 = Sonntag)
│ │ │ │ │
* * * * * BefehlBeispiele
# Jede Minute
* * * * * /usr/local/bin/script.sh
# Jede Stunde um :00
0 * * * * /usr/local/bin/script.sh
# Täglich um 2:30 Uhr
30 2 * * * /usr/local/bin/backup.sh
# Jeden Montag um 5:00 Uhr
0 5 * * 1 /usr/local/bin/weekly-task.sh
# Am 1. jeden Monats um 0:00
0 0 1 * * /usr/local/bin/monthly-report.sh
# Alle 15 Minuten
*/15 * * * * /usr/local/bin/check.sh
# Alle 2 Stunden
0 */2 * * * /usr/local/bin/task.sh
# Werktags um 9:00
0 9 * * 1-5 /usr/local/bin/workday.shCrontab verwalten
Crontab bearbeiten
# Eigene Crontab bearbeiten
crontab -e
# Crontab eines anderen Benutzers (als root)
crontab -u www-data -eCrontab anzeigen
# Eigene Crontab
crontab -l
# Anderer Benutzer
crontab -u www-data -lCrontab löschen
# Alle Jobs löschen
crontab -r
# Mit Bestätigung
crontab -i -rSpezielle Zeitangaben
Makros
@reboot # Bei Systemstart
@yearly # Jährlich (0 0 1 1 *)
@annually # = @yearly
@monthly # Monatlich (0 0 1 * *)
@weekly # Wöchentlich (0 0 * * 0)
@daily # Täglich (0 0 * * *)
@midnight # = @daily
@hourly # Stündlich (0 * * * *)Beispiele mit Makros
@reboot /usr/local/bin/startup-script.sh
@daily /usr/local/bin/daily-backup.sh
@weekly /usr/local/bin/weekly-cleanup.shSystem-Cron-Verzeichnisse
Verzeichnisstruktur
/etc/cron.d/ # Individuelle Cron-Dateien
/etc/cron.hourly/ # Stündlich ausgeführt
/etc/cron.daily/ # Täglich ausgeführt
/etc/cron.weekly/ # Wöchentlich ausgeführt
/etc/cron.monthly/ # Monatlich ausgeführtSkript in cron.daily
# /etc/cron.daily/my-backup
#!/bin/bash
/usr/local/bin/backup.shchmod +x /etc/cron.daily/my-backup/etc/cron.d Format
# /etc/cron.d/my-cronjob
# Format: Zeit + Benutzer + Befehl
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# Täglich um 3:00 als root
0 3 * * * root /usr/local/bin/backup.sh
# Alle 5 Minuten als www-data
*/5 * * * * www-data /var/www/cron/task.phpUmgebungsvariablen
In Crontab setzen
# Am Anfang der Crontab
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=admin@example.com
HOME=/root
# Jobs
0 * * * * /usr/local/bin/script.shWichtige Variablen
| Variable | Beschreibung | Standard | |----------|--------------|----------| | SHELL | Shell für Befehle | /bin/sh | | PATH | Suchpfad | Eingeschränkt | | HOME | Home-Verzeichnis | User-Home | | MAILTO | E-Mail für Output | User | | LOGNAME | Benutzername | User |
Output und Logging
Ausgabe unterdrücken
# Stdout unterdrücken
0 * * * * /script.sh > /dev/null
# Stdout und Stderr unterdrücken
0 * * * * /script.sh > /dev/null 2>&1
# Nur Fehler
0 * * * * /script.sh > /dev/nullIn Datei loggen
# Output in Logdatei
0 * * * * /script.sh >> /var/log/myscript.log 2>&1
# Mit Zeitstempel
0 * * * * /script.sh 2>&1 | while read line; do echo "$(date '+%Y-%m-%d %H:%M:%S') $line"; done >> /var/log/myscript.logE-Mail-Benachrichtigung
# An Adresse senden
MAILTO=admin@example.com
0 * * * * /script.sh
# E-Mail deaktivieren
MAILTO=""
0 * * * * /script.shBest Practices
Vollständige Pfade
# SCHLECHT
0 * * * * script.sh
# GUT
0 * * * * /usr/local/bin/script.shShebang und Berechtigungen
#!/bin/bash
# /usr/local/bin/myscript.sh
# Skript-Inhalt...chmod +x /usr/local/bin/myscript.shLockfile verwenden
#!/bin/bash
# Verhindert parallele Ausführung
LOCKFILE=/var/run/myscript.lock
if [ -f $LOCKFILE ]; then
echo "Script already running"
exit 1
fi
trap "rm -f $LOCKFILE" EXIT
touch $LOCKFILE
# Eigentlicher Script-Inhalt
/usr/local/bin/long-running-task.shMit flock
# In Crontab
0 * * * * /usr/bin/flock -n /var/lock/myscript.lock /usr/local/bin/myscript.shPraktische Beispiele
Backup-Cronjob
# Täglich um 2:00 Uhr
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1#!/bin/bash
# /usr/local/bin/backup.sh
DATE=$(date +%Y%m%d)
BACKUP_DIR="/backup"
# Datenbank sichern
mysqldump -u root --all-databases | gzip > $BACKUP_DIR/mysql-$DATE.sql.gz
# Dateien sichern
tar -czf $BACKUP_DIR/www-$DATE.tar.gz /var/www
# Alte Backups löschen (älter als 7 Tage)
find $BACKUP_DIR -type f -mtime +7 -delete
echo "Backup completed at $(date)"Log-Rotation
# Wöchentlich um Sonntag 4:00
0 4 * * 0 /usr/local/bin/rotate-logs.sh#!/bin/bash
# /usr/local/bin/rotate-logs.sh
LOGDIR="/var/log/myapp"
DATE=$(date +%Y%m%d)
for log in $LOGDIR/*.log; do
mv "$log" "$log.$DATE"
gzip "$log.$DATE"
done
# Alte Logs löschen
find $LOGDIR -name "*.gz" -mtime +30 -deleteSSL-Zertifikat erneuern
# Zweimal täglich (Let's Encrypt Empfehlung)
0 0,12 * * * certbot renew --quiet --post-hook "systemctl reload nginx"Datenbank optimieren
# Sonntag um 3:00
0 3 * * 0 mysqlcheck -u root -p'password' --optimize --all-databasesCache leeren
# Täglich um Mitternacht
0 0 * * * rm -rf /var/cache/myapp/*Festplattennutzung prüfen
# Stündlich
0 * * * * /usr/local/bin/check-disk.sh#!/bin/bash
# /usr/local/bin/check-disk.sh
THRESHOLD=90
USAGE=$(df / | tail -1 | awk '{print $5}' | sed 's/%//')
if [ $USAGE -gt $THRESHOLD ]; then
echo "Disk usage critical: $USAGE%" | mail -s "Disk Alert" admin@example.com
fiSystemd Timer (Alternative)
Timer-Unit erstellen
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily Backup Timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.targetService-Unit
# /etc/systemd/system/backup.service
[Unit]
Description=Backup Service
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.shAktivieren
systemctl daemon-reload
systemctl enable --now backup.timer
# Status prüfen
systemctl list-timersTroubleshooting
Cron-Log prüfen
# Debian/Ubuntu
grep CRON /var/log/syslog
# CentOS/RHEL
grep CRON /var/log/cronManuell testen
# Als richtiger Benutzer ausführen
sudo -u www-data /usr/local/bin/script.shHäufige Fehler
# Problem: Script läuft nicht
# 1. Berechtigungen prüfen
chmod +x /usr/local/bin/script.sh
# 2. Pfade prüfen
which php # Vollständigen Pfad nutzen
# 3. Umgebung prüfen
# Cron hat minimale PATH-Variable!E-Mail-Probleme
# Mail-System prüfen
echo "Test" | mail -s "Test" admin@example.com
# Lokale Mail prüfen
cat /var/mail/rootCron-Dienst verwalten
# Status
systemctl status cron
# Neustart
systemctl restart cron
# Logs
journalctl -u cronZusammenfassung
| Zeit | Syntax | |------|--------| | Jede Minute | | | Jede Stunde | 0 | | Täglich um 2:00 | 0 2 | | Wöchentlich (So) | 0 0 0 | | Monatlich (1.) | 0 0 1 | | Alle 15 Min | /15 | | Werktags 9:00 | 0 9 * 1-5 | | Bei Systemstart | @reboot |
Fazit
Cronjobs sind essentiell für Server-Automatisierung. Achten Sie auf vollständige Pfade, richtige Berechtigungen und sinnvolles Logging. Verwenden Sie Lockfiles für lang laufende Jobs und testen Sie neue Cronjobs immer manuell bevor Sie sie einrichten.