Cronjobs erstellen & verwalten
Automatisiere deine Backups mit cron. Einmal einrichten, nie wieder vergessen.
🤔 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
📖 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
✏️ Schritt 2: Crontab bearbeiten
Die crontab wird mit folgendem Befehl bearbeitet:
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
💾 Schritt 3: Backup-Cronjob einrichten
Ein typischer Backup-Cronjob mit restic:
# 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):
#!/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
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.
# 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:
# /etc/logrotate.d/backup
/var/log/backup.log {
weekly
rotate 4
compress
missingok
notifempty
} Best Practice
🔔 Schritt 5: Benachrichtigungen bei Fehlern
Ein Backup, das still fehlschlägt, ist nutzlos. Richte Benachrichtigungen ein:
Option 1: ntfy.sh (einfach)
# 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
# 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
# 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:
# 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:
# 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
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?
Zu welcher Zeit sollten Backups laufen?
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.