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)
│ │ │ │ │
* * * * * Befehl

Beispiele

# 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.sh

Crontab verwalten

Crontab bearbeiten

# Eigene Crontab bearbeiten
crontab -e

# Crontab eines anderen Benutzers (als root)
crontab -u www-data -e

Crontab anzeigen

# Eigene Crontab
crontab -l

# Anderer Benutzer
crontab -u www-data -l

Crontab löschen

# Alle Jobs löschen
crontab -r

# Mit Bestätigung
crontab -i -r

Spezielle 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.sh

System-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ührt

Skript in cron.daily

# /etc/cron.daily/my-backup
#!/bin/bash
/usr/local/bin/backup.sh
chmod +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.php

Umgebungsvariablen

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.sh

Wichtige 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/null

In 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.log

E-Mail-Benachrichtigung

# An Adresse senden
MAILTO=admin@example.com
0 * * * * /script.sh

# E-Mail deaktivieren
MAILTO=""
0 * * * * /script.sh

Best Practices

Vollständige Pfade

# SCHLECHT
0 * * * * script.sh

# GUT
0 * * * * /usr/local/bin/script.sh

Shebang und Berechtigungen

#!/bin/bash
# /usr/local/bin/myscript.sh

# Skript-Inhalt...
chmod +x /usr/local/bin/myscript.sh

Lockfile 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.sh

Mit flock

# In Crontab
0 * * * * /usr/bin/flock -n /var/lock/myscript.lock /usr/local/bin/myscript.sh

Praktische 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 -delete

SSL-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-databases

Cache 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
fi

Systemd 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.target

Service-Unit

# /etc/systemd/system/backup.service
[Unit]
Description=Backup Service

[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup.sh

Aktivieren

systemctl daemon-reload
systemctl enable --now backup.timer

# Status prüfen
systemctl list-timers

Troubleshooting

Cron-Log prüfen

# Debian/Ubuntu
grep CRON /var/log/syslog

# CentOS/RHEL
grep CRON /var/log/cron

Manuell testen

# Als richtiger Benutzer ausführen
sudo -u www-data /usr/local/bin/script.sh

Hä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/root

Cron-Dienst verwalten

# Status
systemctl status cron

# Neustart
systemctl restart cron

# Logs
journalctl -u cron

Zusammenfassung

| 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.