Ein Prozess wird unter Linux als korrekt abgeschlossen angesehen, wenn sein Exit-Status 0 war.
Ich habe gesehen, dass Segmentierungsfehler häufig zu einem Exit-Status von 11 führen, obwohl ich nicht weiß, ob dies einfach die Konvention ist, bei der ich arbeite (die Apps, die so fehlgeschlagen sind, waren alle intern) oder ein Standard.
Gibt es Standard-Exit-Codes für Prozesse unter Linux?
linux
error-handling
exit-code
Nathan Fellman
quelle
quelle
Antworten:
8 Bits des Rückkehrcodes und 8 Bits der Nummer des Tötungssignals werden bei der Rückkehr von
wait(2)
& co zu einem einzigen Wert gemischt . .Wie bestimmen Sie den Exit-Status? Traditionell speichert die Shell nur einen 8-Bit-Rückkehrcode, setzt jedoch das High-Bit, wenn der Prozess abnormal beendet wurde.
Wenn Sie etwas anderes sehen, verfügt das Programm wahrscheinlich über einen
SIGSEGV
Signalhandler, der dannexit
normal aufruft , sodass es nicht durch das Signal getötet wird. (Programme können alle Signale außerSIGKILL
und verarbeitenSIGSTOP
.)quelle
Teil 1: Advanced Bash Scripting Guide
Wie immer die erweiterte Bash Scripting Guide hat große Informationen : (. Dies wurde in einer anderen Antwort verknüpft ist , sondern auf eine nicht-kanonische URL)
Teil 2: sysexits.h
Die ABSG-Referenzen
sysexits.h
.Unter Linux:
quelle
man sysexits
sysexits.h
? Die Manpage, auf die sich jeder bezieht, ist nur Prosa. Zum Beispiel verweist es daraufEX_OK
, definiert es aber nicht normativ wie die anderen Codes. Fehlen noch mehr?'1' >>> Catchall für allgemeine Fehler
'2' >>> Missbrauch von Shell-Builtins (laut Bash-Dokumentation)
'126' >>> Der aufgerufene Befehl kann nicht ausgeführt werden
'127' >>> "Befehl nicht gefunden"
'128' >>> Ungültiges Argument zum Beenden
'128 + n' >>> Schwerwiegendes Fehlersignal "n"
'130' >>> Skript von Control-C beendet
'255' >>> Status außerhalb des Bereichs verlassen
Dies ist für Bash. Für andere Anwendungen gibt es jedoch andere Exit-Codes.
quelle
Keine der älteren Antworten beschreibt den Exit-Status 2 korrekt. Im Gegensatz zu dem, was sie behaupten, geben Status 2 Ihre Befehlszeilen-Dienstprogramme tatsächlich zurück, wenn sie nicht ordnungsgemäß aufgerufen werden. (Ja, eine Antwort kann neun Jahre alt sein, Hunderte von positiven Stimmen haben und immer noch falsch sein.)
Hier ist die reale, langjährige Exit-Status-Konvention für die normale Beendigung, dh nicht per Signal:
Gibt beispielsweise
diff
0 zurück, wenn die verglichenen Dateien identisch sind, und 1, wenn sie sich unterscheiden. Durch die langjährige Konvention zurückkehren Unix - Programme Exit - Status 2 , wenn falsch genannt (unbekannte Optionen, falsche Anzahl von Argumenten, etc.) zum Beispieldiff -N
,grep -Y
oderdiff a b c
wird alle Ergebnisse in$?
seinem Set 2. die Praxis ist dies und ist seit der Anfänge von Unix in den 1970er Jahren.Die akzeptierte Antwort erklärt, was passiert, wenn ein Befehl durch ein Signal beendet wird. Kurz gesagt, eine Beendigung aufgrund eines nicht erfassten Signals führt zum Exit-Status
128+[<signal number>
. Beispielsweise führt die Beendigung durchSIGINT
( Signal 2 ) zum Ausgangsstatus 130.Anmerkungen
Mehrere Antworten definieren den Exit-Status 2 als "Missbrauch von Bash-Buildins". Dies gilt nur, wenn bash (oder ein bash-Skript) mit Status 2 beendet wird. Betrachten Sie dies als einen Sonderfall eines falschen Verwendungsfehlers.
In
sysexits.h
, wie in der beliebtesten Antwort erwähnt , wird der Exit-StatusEX_USAGE
("Befehlszeilen-Verwendungsfehler") als 64 definiert. Dies spiegelt jedoch nicht die Realität wider: Mir ist kein allgemeines Unix-Dienstprogramm bekannt, das bei falschem Aufruf 64 zurückgibt (Beispiele willkommen ). Das sorgfältige Lesen des Quellcodes zeigt, dass diessysexits.h
eher ein Ziel als ein Spiegelbild der tatsächlichen Verwendung ist:Mit anderen Worten, diese Definitionen spiegeln nicht die damals übliche Praxis (1993) wider, waren jedoch absichtlich nicht damit vereinbar. Mehr ist schade.
quelle
more
werden die Terminalmodi zurückgesetzt und mit dem Status 0 beendet (Sie können es versuchen).Abgesehen von 0, was Erfolg bedeutet, gibt es keine Standard-Exit-Codes. Ein Wert ungleich Null bedeutet auch nicht unbedingt einen Fehler.
stdlib.h definiert
EXIT_FAILURE
als 1 undEXIT_SUCCESS
als 0, aber das war es auch schon.Die 11 bei Segfault ist interessant, da 11 die Signalnummer ist, die der Kernel verwendet, um den Prozess im Falle eines Segfault zu beenden. Es gibt wahrscheinlich einen Mechanismus, entweder im Kernel oder in der Shell, der dies in den Exit-Code übersetzt.
quelle
sysexits.h enthält eine Liste der Standard-Exit-Codes. Es scheint mindestens aus dem Jahr 1993 zu stammen und wird von einigen großen Projekten wie Postfix verwendet. Ich kann mir also vorstellen, dass dies der richtige Weg ist.
Von der OpenBSD-Manpage:
quelle
In erster Näherung ist 0 Erfolg, Nicht-Null ist Fehler, wobei 1 allgemeiner Fehler ist und alles, was größer als eins ist, ein spezifischer Fehler ist. Abgesehen von den trivialen Ausnahmen von false und test, die beide 1 für den Erfolg ergeben sollen, habe ich noch einige andere Ausnahmen gefunden.
Realistischer bedeutet 0 Erfolg oder vielleicht Misserfolg, 1 bedeutet allgemeiner Misserfolg oder vielleicht Erfolg, 2 bedeutet allgemeiner Misserfolg, wenn 1 und 0 beide für Erfolg verwendet werden, aber vielleicht auch Erfolg.
Der Befehl diff gibt 0 an, wenn die verglichenen Dateien identisch sind, 1, wenn sie sich unterscheiden, und 2, wenn sich die Binärdateien unterscheiden. 2 bedeutet auch Fehler. Der Befehl less gibt 1 für Fehler an, es sei denn, Sie geben kein Argument an. In diesem Fall wird 0 trotz Fehler beendet.
Der Befehl more und der Befehl buchstabieren geben 1 für Fehler an, es sei denn, der Fehler ist auf eine verweigerte Berechtigung, eine nicht vorhandene Datei oder den Versuch zurückzuführen, ein Verzeichnis zu lesen. In jedem dieser Fälle beenden sie 0, obwohl sie fehlschlagen.
Dann gibt der Befehl expr 1 für sucess aus, es sei denn, die Ausgabe ist die leere Zeichenfolge oder Null. In diesem Fall ist 0 sucess. 2 und 3 sind Fehler.
Dann gibt es Fälle, in denen Erfolg oder Misserfolg nicht eindeutig sind. Wenn grep kein Muster findet, wird 1 beendet, 2 jedoch für einen echten Fehler (wie die verweigerte Berechtigung). Klist beendet 1 auch, wenn es kein Ticket findet, obwohl dies nicht wirklich ein Fehler ist, als wenn grep kein Muster findet oder wenn Sie ein leeres Verzeichnis haben.
Leider scheinen die vorhandenen Unix-Kräfte keine logischen Regeln durchzusetzen, selbst bei sehr häufig verwendeten ausführbaren Dateien.
quelle
Programme geben einen 16-Bit-Exit-Code zurück. Wenn das Programm mit einem Signal beendet wurde, enthält das Byte höherer Ordnung das verwendete Signal, andernfalls ist das Byte niedriger Ordnung der vom Programmierer zurückgegebene Exit-Status.
Wie wird dieser Exit-Code der Statusvariablen $ zugewiesen? liegt dann an der Shell. Bash behält die unteren 7 Bits des Status bei und verwendet dann 128 + (Signal nr) zur Anzeige eines Signals.
Die einzige "Standard" -Konvention für Programme ist 0 für Erfolg, ungleich Null für Fehler. Eine andere verwendete Konvention ist die Rückgabe von errno bei einem Fehler.
quelle
Standard-Unix-Exit-Codes werden von sysexits.h als weiteres erwähntes Poster definiert. Dieselben Exit-Codes werden von tragbaren Bibliotheken wie Poco verwendet - hier eine Liste davon:
http://pocoproject.org/docs/Poco.Util.Application.html#16218
Ein Signal 11 ist ein SIGSEGV-Signal (Segmentverletzung), das sich von einem Rückkehrcode unterscheidet. Dieses Signal wird vom Kernel als Reaktion auf einen fehlerhaften Seitenzugriff generiert, wodurch das Programm beendet wird. Eine Liste der Signale finden Sie auf der Signal-Manpage (führen Sie "Man-Signal" aus).
quelle
Wenn Linux 0 zurückgibt, bedeutet dies Erfolg. Alles andere bedeutet Fehler, jedes Programm hat seine eigenen Exit-Codes, daher wäre es ziemlich lang gewesen, sie alle aufzulisten ...!
Bei dem 11-Fehlercode handelt es sich tatsächlich um die Segmentierungsfehlernummer, was hauptsächlich bedeutet, dass das Programm auf einen Speicherort zugegriffen hat, der nicht zugewiesen wurde.
quelle