Wie Exit-Codes funktionieren
Jeder Prozess endet mit einem 8-Bit-Status, 0 bis 255. Per Konvention heißt 0 Erfolg und alles andere Fehler; die Shell stellt ihn als $? bereit, und &&, ||, if und set -e verzweigen darauf. Die Bedeutung der Zahl jenseits von null/nicht-null gehört dem Programm, mit ein paar fast universellen Konventionen.
Die Codes der Shell selbst
- 126: Die Datei wurde gefunden, konnte aber nicht ausgeführt werden. Fehlendes Ausführen-Bit, ein Verzeichnis, ein Binary für eine andere Architektur oder ein
noexec-Mount. - 127: nicht gefunden. Ein Tippfehler, ein nicht installiertes Programm oder ein
PATH, der sich zwischen Ihrer Shell und der Umgebung des Skripts unterscheidet (cron, systemd, Docker). Auch eine Shebang-Zeile auf einen fehlenden Interpreter, einschließlich\r\n-Zeilenenden, die/bin/bash\rergeben. - 128 + n: Der Prozess starb durch Signal n. Die Shell kann ein Signal nicht direkt zurückgeben, also addiert sie 128. 130 ist Strg-C (SIGINT 2), 137 ist SIGKILL (9), 139 ist SIGSEGV (11), 143 ist SIGTERM (15). Die Signalreferenz listet alle.
137 in Containern
Exit 137 aus einem Container ist fast immer der OOM-Killer des Kernels oder die Container-Laufzeit, die ein Speicherlimit durchsetzt: Der Prozess bekam SIGKILL, das sich nicht abfangen lässt, also hat die Anwendung nichts geloggt. Prüfen Sie docker inspect auf OOMKilled: true, dmesg auf „Out of memory“ oder Kubernetes-Events auf OOMKilled. 143 ist das normale Ergebnis von docker stop oder einer Pod-Beendigung, wenn der Prozess SIGTERM behandelt hat; 137 nach einem Stop heißt, er hat sich nicht innerhalb der Frist beendet.
sysexits.h
BSD definierte die Codes 64–78, damit Mail- und Systemwerkzeuge Fehlerkategorien melden (EX_USAGE 64, EX_NOINPUT 66, EX_TEMPFAIL 75…). Postfix, sendmail und manche Perl- und Go-Programme nutzen sie noch; sonst nichts, also betrachten Sie sie als Konvention, nicht als Regel.
Fragen
Was bedeutet Exit-Code 1?
Ein allgemeiner Fehler: Das Programm fand, dass etwas schiefging, und hatte keinen genaueren Code. Bei grep heißt es, keine Zeile passte, was gar kein Fehler ist. Lesen Sie die stderr-Ausgabe des Programms, nicht die Zahl.
Warum bekomme ich 127 in cron oder systemd, aber nicht in meiner Shell?
Der PATH ist anders. Das Profil Ihrer Shell fügt Verzeichnisse wie /usr/local/bin oder ~/.local/bin hinzu, die cron und systemd nicht sehen. Nutzen Sie absolute Pfade oder setzen Sie PATH am Anfang des Skripts.
Was ist der maximale Exit-Code?
255. exit 256 springt auf 0, exit 300 wird zu 44 (300 mod 256). Negative Werte springen ebenfalls: exit(-1) ist 255.
Wie bekomme ich den Exit-Code einer Pipeline?
Standardmäßig ist $? der Status des letzten Befehls. set -o pipefail lässt die Pipeline scheitern, wenn irgendeine Stufe scheitert, und das Array PIPESTATUS in bash enthält den Code jeder Stufe.