🛡️ 1. Der Bash Strict Mode (set -euo pipefail)
In Produktions-Umgebungen ist "Stiller Weiterlauf bei Fehlern" die häufigste Ursache für Datenverlust. Der Strict Mode stoppt das Skript deterministisch beim ersten Fehler:
#!/usr/bin/env bash
set -euo pipefail
IFS=$'\n\t'
# 1. set -e (errexit): Bricht bei unhandled Exit-Codes != 0 sofort ab
# 2. set -u (nounset): Behandelt Zugriffe auf ungesetzte Variablen als Fatal Error
# 3. set -o pipefail: Ein Fehler in foo | bar | baz lässt die gesamte Pipeline scheitern
# Erlaubte Fehler sauber abfangen:
optional_cleanup || true
🧹 2. Signal-Traps, Cleanup & File Locks (flock)
Hinterlasse niemals Datenmüll im Dateisystem und verhindere Race Conditions bei parallel laufenden Cronjobs:
# 🎯 1. EXIT Trap – Garantiertes Aufräumen:
WORK_DIR=$(mktemp -d)
trap 'rm -rf "$WORK_DIR"' EXIT
# 🎯 2. Exklusives Locking gegen Doppel-Ausführung:
exec 200>/var/lock/backup.lock
flock -n 200 || { echo "Job läuft bereits!" >&2; exit 1; }
# 🎯 3. Trace-Debugging im laufenden Betrieb:
set -x # Zeigt jeden ausgeführten Befehl mit '+' an
grep "root" /etc/passwd
set +x # Schaltet Tracing wieder aus
set -euo pipefail: Das Notbremssystem im Hochgeschwindigkeitszug. Sobald eine Variable wackelt oder ein Zwischenhalt entgleist, stoppt der Zug sofort, statt ungebremst in den Abgrund zu rasen.
flock: Das "Besetzt"-Schild am Hotelzimmer. Kein zweiter Gast kann eintreten, solange die Tür verriegelt ist!
📑 3. Cheat-Sheet: Defensive Bash
| Befehl / Option | Syntax | Schutzwirkung |
|---|---|---|
set -e |
set -o errexit |
Sofortiger Abbruch bei Befehlsfehlern |
set -u |
set -o nounset |
Verhindert Ausführung mit leeren/ungesetzten Variablen |
set -o pipefail |
cmd1 | cmd2 |
Gibt Fehlercode zurück, falls irgendein Glied der Pipe fehlschlägt |
trap '...' EXIT |
trap cleanup EXIT |
Führt Aufräumcode bei normalem und abnormalem Beenden aus |
flock -n <file> |
flock -n /tmp/job.lock cmd |
Non-blocking Concurrency Lock gegen parallele Runs |
set -x / set +x |
set -x; ...; set +x |
Aktiviert / Deaktiviert interaktiven Befehls-Trace |
🎯 Aufgaben & Checkliste in aufgabe.sh
Ohne set -u führt ein unbedachter Aufruf wie rm -rf /var/app/$ENV_NAME/cache bei leerer Variable zu rm -rf /var/app//cache. Mit set -u bricht die Shell sofort vor dem Löschbefehl ab!