← Zurück zu Backup & Cronjobs

Cronjobs erstellen & verwalten

Automatisiere deine Backups mit cron. Einmal einrichten, nie wieder vergessen.

⏱️ 25 Minuten 📊 Mittel
🤔 Schritt 0: Was ist cron? +

cron ist der Standard-Scheduler unter Linux. Er führt Befehle zu festgelegten Zeiten automatisch aus - ideal für regelmäßige Backups.

💡

cron vs. systemd timer

Moderne Systeme bieten auch systemd timer als Alternative. Cron ist aber universeller, einfacher zu verstehen und auf jedem Linux-System verfügbar.
📖 Schritt 1: Crontab-Syntax verstehen +

Jede Zeile in der crontab folgt diesem Schema:

┌───────────── Minute (0-59)
│ ┌─────────── Stunde (0-23)
│ │ ┌───────── Tag des Monats (1-31)
│ │ │ ┌─────── Monat (1-12)
│ │ │ │ ┌───── Wochentag (0-7, 0 und 7 = Sonntag)
│ │ │ │ │
* * * * * befehl

Beispiele:

Ausdruck Bedeutung
0 3 * * * Täglich um 03:00 Uhr
0 3 * * 0 Jeden Sonntag um 03:00 Uhr
0 3 1 * * Am 1. jeden Monats um 03:00 Uhr
*/15 * * * * Alle 15 Minuten
0 */4 * * * Alle 4 Stunden
0 3 * * 1-5 Mo-Fr um 03:00 Uhr

Tipp

Nutze crontab.guru um Cron-Ausdrücke zu testen und zu verstehen.
✏️ Schritt 2: Crontab bearbeiten +

Die crontab wird mit folgendem Befehl bearbeitet:

bash
crontab -e

Beim ersten Aufruf wirst du nach einem Editor gefragt. Empfehlung: nano für Einsteiger.

Wichtige crontab-Befehle:

Befehl Funktion
crontab -e Crontab bearbeiten
crontab -l Crontab anzeigen
crontab -r Crontab löschen (Vorsicht!)
sudo crontab -e -u root Root-Crontab bearbeiten
⚠️

User vs. Root

Cronjobs laufen im Kontext des Users, der sie erstellt hat. Für Backup-Jobs, die root-Rechte brauchen, musst du die root-crontab bearbeiten oder sudo in der crontab verwenden.
💾 Schritt 3: Backup-Cronjob einrichten +

Ein typischer Backup-Cronjob mit restic:

bash
# Tägliches Backup um 03:00 Uhr
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# Wöchentliches Cleanup jeden Sonntag um 04:00 Uhr
0 4 * * 0 /usr/local/bin/backup-cleanup.sh >> /var/log/backup.log 2>&1

Das Backup-Script (backup.sh):

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

# Konfiguration
export RESTIC_REPOSITORY="/mnt/backup/restic-repo"
export RESTIC_PASSWORD_FILE="/root/.restic-password"

# Zu sichernde Verzeichnisse
BACKUP_PATHS="/etc /home /var/www /var/lib/docker/volumes"

# Ausschlüsse
EXCLUDES="--exclude='*.tmp' --exclude='node_modules' --exclude='.cache'"

# Backup starten
echo "$(date): Backup gestartet"
restic backup $BACKUP_PATHS $EXCLUDES

# Status prüfen
if [ $? -eq 0 ]; then
    echo "$(date): Backup erfolgreich"
else
    echo "$(date): FEHLER beim Backup!"
    # Optional: Benachrichtigung senden
    # curl -X POST "https://ntfy.sh/mein-backup-channel" -d "Backup fehlgeschlagen!"
fi
💡

Ausführbar machen

Nicht vergessen: chmod +x /usr/local/bin/backup.sh
📝 Schritt 4: Output und Logging +

Cron sendet standardmäßig Output per E-Mail. Das funktioniert oft nicht richtig. Besser: In Datei loggen.

bash
# Output in Logdatei schreiben (stdout + stderr)
0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

# Erklärung:
# >>           = Anhängen an Datei (statt überschreiben)
# 2>&1         = stderr zu stdout umleiten
# /dev/null    = Output verwerfen (nicht empfohlen für Backups!)

Logrotation einrichten:

bash
# /etc/logrotate.d/backup
/var/log/backup.log {
    weekly
    rotate 4
    compress
    missingok
    notifempty
}

Best Practice

Logs immer aufbewahren! Bei Problemen sind sie Gold wert für die Fehlersuche.
🔔 Schritt 5: Benachrichtigungen bei Fehlern +

Ein Backup, das still fehlschlägt, ist nutzlos. Richte Benachrichtigungen ein:

Option 1: ntfy.sh (einfach)

bash
# Am Ende des Backup-Scripts
if [ $? -ne 0 ]; then
    curl -X POST "https://ntfy.sh/dein-geheimer-channel" \
         -H "Title: Backup fehlgeschlagen" \
         -H "Priority: high" \
         -d "Server: $(hostname), Zeit: $(date)"
fi

Option 2: Telegram Bot

bash
# Telegram-Benachrichtigung
TELEGRAM_BOT_TOKEN="123456:ABC..."
TELEGRAM_CHAT_ID="-1001234567890"

send_telegram() {
    curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_BOT_TOKEN/sendMessage" \
         -d chat_id="$TELEGRAM_CHAT_ID" \
         -d text="$1"
}

# Bei Fehler
if [ $? -ne 0 ]; then
    send_telegram "⚠️ Backup fehlgeschlagen auf $(hostname)!"
fi

Option 3: n8n Webhook

bash
# n8n Workflow triggern
curl -X POST "https://n8n.deine-domain.de/webhook/backup-status" \
     -H "Content-Type: application/json" \
     -d '{"status": "failed", "server": "'$(hostname)'", "time": "'$(date)'"}'
👀 Schritt 6: Cronjobs überwachen +

So prüfst du, ob Cronjobs laufen:

Cron-Logs ansehen:

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

# CentOS/RHEL
cat /var/log/cron

# Letzte Backup-Logs
tail -50 /var/log/backup.log

Laufende Cronjobs aller User:

bash
# Alle User-Crontabs anzeigen
for user in $(cut -f1 -d: /etc/passwd); do
    crontab -l -u $user 2>/dev/null | grep -v '^#' | grep -v '^$' && echo "--- $user ---"
done

# System-Cronjobs
ls -la /etc/cron.d/
ls -la /etc/cron.daily/
⚠️

Timezone beachten

Cron nutzt die System-Zeitzone. Prüfe mit timedatectl ob sie korrekt ist. Bei UTC-Servern musst du die gewünschte lokale Zeit umrechnen.

Häufige Fragen

Mein Cronjob läuft nicht - was tun?
Häufige Ursachen: 1) Script nicht ausführbar (chmod +x), 2) Falscher Pfad (cron hat anderes PATH), 3) Fehlende Umgebungsvariablen. Teste das Script erst manuell, dann prüfe die Cron-Logs.
Zu welcher Zeit sollten Backups laufen?
Nachts, wenn wenig Last ist - typisch 02:00-05:00 Uhr. Vermeide volle Stunden, da viele Cronjobs dann starten. Besser: 03:17 statt 03:00.
Was ist der Unterschied zwischen /etc/crontab und crontab -e?
/etc/crontab ist die System-Crontab mit User-Feld. crontab -e bearbeitet die User-spezifische Crontab. Für Backups meist root-crontab oder /etc/cron.d/ nutzen.
Kann ich Cronjobs in Docker nutzen?
Ja, aber es ist komplizierter. Besser: Host-Cronjob, der docker exec aufruft, oder dedizierter Cron-Container. Oder gleich n8n für Container-Orchestrierung nutzen.