Begriff
Trap
Warum wichtig?
Dieser Begriff ist ein Knoten im SengakujiWorks-Wissensnetz. Nutze Level 0 für die erste Einordnung, Level 1 für Praxis, Level 2 für technische Struktur und Level 3 für Grenzen, Fallstricke und Expertenkontext.
Das Wort bedeutet "Falle", aber in der IT ist es eher ein Alarm. Es gibt zwei Hauptbedeutungen:
- Netzwerk (SNMP): Ein Drucker brennt. Er wartet nicht, bis der Admin fragt ("Wie geht's?"). Er sendet sofort eine Nachricht: "Feuer!" an den Server. Das ist ein SNMP Trap.
- Programmierung (Bash/OS): Dein Skript läuft. Jemand drückt
Strg+C(Abbruch). Normalerweise stirbt das Skript sofort. Mit einem Trap kannst du diesen "Abbruch-Befehl" abfangen und erst aufräumen ("Warte, ich muss noch die temporäre Datei löschen!").
Merksatz: Ein Mechanismus, um asynchrone Ereignisse (Fehler, Signale) abzufangen und darauf zu reagieren, statt das Programm unkontrolliert abstürzen zu lassen.
Bash Scripting (Sauberes Aufräumen):
tempfile=$(mktemp)
trap "rm -f $tempfile; echo 'Aufgeraeumt!'" EXIT
echo "Arbeite..."
sleep 10
Networking (SNMP):
Der Router sendet SNMPv2-MIB::coldStart an den Monitoring-Server (Nagios/Zabbix), wenn er neu gestartet ist.
1. OS Signals & Handlers
In C/Linux: signal(SIGINT, handler_func).
Der Kernel unterbricht den Prozess (Interrupt), springt in die handler_func, und macht danach weiter.
Manche Signale kann man trappen (SIGINT, SIGTERM).
Andere nicht: SIGKILL (Kill -9). Das ist der "Kopfschuss". Der Prozess hat keine Chance mehr, aufzuräumen.
Darum: Nutze immer docker stop (sendet SIGTERM -> Trap möglich) statt docker kill (kein Trap möglich).
2. SNMP Traps vs. Informs
- Trap: Fire and Forget. Der Drucker sendet "Feuer!" (UDP). Wenn das Paket verloren geht, weiß der Admin nichts vom Feuer.
- Inform: "Feuer!". Der Server muss antworten: "Habs gehört." Wenn keine Antwort kommt, sendet der Drucker es nochmal. Zuverlässiger, aber mehr Last.
3. CPU Traps (Exceptions)
Auf unterster Hardware-Ebene (Assembly) ist ein "Trap" eine Software-Exception.
Beispiel: Division durch Null.
Die CPU löst einen Trap aus. Das Betriebssystem übernimmt die Kontrolle ("Oh, Programm X hat Quark gemacht") und sendet ein Signal (SIGFPE) an das Programm oder killt es (Core Dump).
Auch Systemaufrufe (Syscalls) funktionieren so: Programm führt INT 0x80 aus (Trap), CPU schaltet in den Kernel-Mode, Kernel liest Datei, schaltet zurück (Context Switch).
Bash: Der magische trap ERR (Stacktraces in Shell)
Jeder nutzt trap EXIT, aber Profis nutzen das mächtige trap ERR.
Kombiniert mit set -e bricht ein Script sofort ab, wenn ein Kommando fehlschlägt. Der Debugging-Albtraum: Welcher Befehl crashte in Zeile 500?
Man definiert am Anfang trap 'echo "Error in line $LINENO"' ERR.
Noch krasser: Mit den internen Arrays ${FUNCNAME[@]} und ${BASH_LINENO[@]} lässt sich im Trap-Handler ein lupenreiner Programm-Stacktrace wie in Java generieren, der den genauen Aufrufpfad der Funktionen printet, bevor die Shell sich selbst terminiert.
SNMPv3 (Vom reinen Trap zum Autorisierungs-Albtraum)
SNMP Traps der v1 und v2c fliegen im Klartext (UDP 162) als Broadcast durchs LAN, authentifiziert nur durch einen dämlichen "Community-String" (meist "public"): Ein Paradies für Hacker, die falsche Traps spoofen ("Server brennt!"), um den Admin abzulenken, während sie Daten stehlen.
SNMPv3 fixt das radikal, ist aber berüchtigt für seine Konfigurationshölle. Ein v3 Trap erfordert USM (User-based Security Model): AES-Verschlüsselung der Payload und kryptografische Authentifizierung (SHA). Damit der Trapsender senden kann, muss die EngineID (eine Hex-Hardware-ID) beidseitig im Voraus im Setup registriert und verheiratet sein. Wenn die EngineID bei einem VM Re-Provisioning abweicht, dropt der Zabbix-Server jeden Notruf wortlos im Müll.
K8s PreStop Hooks (Der Cloud-Native Trap)
In Container-Architekturen ist das Trappen von SIGTERM oft instabil (weil PID 1 in Docker oft eine Bash ist, die Signale nicht korrekt an den child Node-Prozess weiterreicht).
Deshalb nutzt Kubernetes PreStop Hooks.
Anstatt sich auf OS-Signale zu verlassen, definiert man im Deployment YAML (lifecycle: preStop) ein Kommando (z.B. curl -X POST localhost:8080/drain), das K8s zwingend ausführt, bevor es das SIGTERM sendet. Dieser Container-Runtime "Trap" gibt dem Webserver Zeit, sich aus dem Load Balancer zu deregistrieren und offene TCP-Sockets gnädig abzuarbeiten, bevor nach Ablauf der terminationGracePeriodSeconds der Sensenmann vorfährt.
Quick-Check
Strg+Z?
SendetSIGTSTP(Terminal Stop). Pausiert den Prozess (Freeze), beendet ihn aber nicht. Kann man auch trappen, aber meist lässt man es, damit "bg" (Background) funktioniert.Warum Traps in Docker?
Damit Datenbanken beim Shutdown (docker stop) ihren Cache auf Disk schreiben können (Flush). Ohne Trap droht Datenverlust.Debug Trap?
Debugger (GDB) nutzen Traps (INT 3auf x86), um an Breakpoints anzuhalten. Die CPU stoppt exakt an der Zeile und gibt die Kontrolle an den Debugger.