408 Stimmen

Gibt es unter Linux Standard-Exit-Statuscodes?

Ein Prozess gilt unter Linux als korrekt beendet, wenn sein Exit-Status 0 war.

Ich habe gesehen, dass Segmentierungsfehler oft zu einem Exit-Status von 11 führen, obwohl ich nicht weiß, ob dies einfach die Konvention ist, wo ich arbeite (die Anwendungen, die so fehlgeschlagen sind, waren alle intern) oder ein Standard.

Gibt es Standard-Exit-Codes für Prozesse in Linux?

401voto

Schof Punkte 6053

Teil 1: Leitfaden für fortgeschrittene Bash-Skripterstellung

Wie immer ist die Leitfaden für fortgeschrittene Bash-Skripterstellung hat tolle Informationen : (Dies wurde in einer anderen Antwort verlinkt, allerdings zu einer nicht-kanonischen URL).

1: Auffangbehälter für allgemeine Fehler
2: Falsche Verwendung von Shell-Builtins (laut Bash-Dokumentation)
126: Aufgerufener Befehl kann nicht ausgeführt werden
127: "Befehl nicht gefunden"
128: Ungültiges Argument für Exit
128+n: Fatales Fehlersignal "n"
255: Exit-Status außerhalb des Bereichs (exit nimmt nur Integer-Args im Bereich 0 - 255 an)

Teil 2: sysexits.h

Die ABSG verweist auf sysexits.h .

Unter Linux:

$ find /usr -name sysexits.h
/usr/include/sysexits.h
$ cat /usr/include/sysexits.h

/*
 * Copyright (c) 1987, 1993
 *  The Regents of the University of California.  All rights reserved.

 (A whole bunch of text left out.)

#define EX_OK           0       /* successful termination */
#define EX__BASE        64      /* base value for error messages */
#define EX_USAGE        64      /* command line usage error */
#define EX_DATAERR      65      /* data format error */
#define EX_NOINPUT      66      /* cannot open input */    
#define EX_NOUSER       67      /* addressee unknown */    
#define EX_NOHOST       68      /* host name unknown */
#define EX_UNAVAILABLE  69      /* service unavailable */
#define EX_SOFTWARE     70      /* internal software error */
#define EX_OSERR        71      /* system error (e.g., can't fork) */
#define EX_OSFILE       72      /* critical OS file missing */
#define EX_CANTCREAT    73      /* can't create (user) output file */
#define EX_IOERR        74      /* input/output error */
#define EX_TEMPFAIL     75      /* temp failure; user is invited to retry */
#define EX_PROTOCOL     76      /* remote error in protocol */
#define EX_NOPERM       77      /* permission denied */
#define EX_CONFIG       78      /* configuration error */

#define EX__MAX 78      /* maximum listed value */

96voto

ephemient Punkte 189038

8 Bits des Rückgabecodes und 8 Bits der Nummer des Tötungssignals werden zu einem einzigen Wert bei der Rückkehr von wait(2) & Co. .

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <signal.h>

int main() {
    int status;

    pid_t child = fork();
    if (child <= 0)
        exit(42);
    waitpid(child, &status, 0);
    if (WIFEXITED(status))
        printf("first child exited with %u\n", WEXITSTATUS(status));
    /* prints: "first child exited with 42" */

    child = fork();
    if (child <= 0)
        kill(getpid(), SIGSEGV);
    waitpid(child, &status, 0);
    if (WIFSIGNALED(status))
        printf("second child died with %u\n", WTERMSIG(status));
    /* prints: "second child died with 11" */
}

Wie bestimmen Sie den Ausgangsstatus? Traditionell speichert die Shell nur einen 8-Bit-Rückgabecode, setzt aber das hohe Bit, wenn der Prozess abnormal beendet wurde.

$ sh -c 'exit 42'; echo $?
42
$ sh -c 'kill -SEGV $$'; echo $?
Segmentation fault
139
$ expr 139 - 128
11

Wenn Sie etwas anderes sehen, dann hat das Programm wahrscheinlich einen SIGSEGV Signal-Handler, der dann aufruft exit normal, so dass es nicht wirklich durch das Signal getötet wird. (Programme können wählen, ob sie mit anderen Signalen als SIGKILL y SIGSTOP .)

79voto

segfault Punkte 5571

'1' : Auffangbecken für allgemeine Fehler

'2' : Falsche Verwendung von Shell-Builtins (laut Bash-Dokumentation)

'126' : Aufgerufener Befehl kann nicht ausgeführt werden

'127' : "Befehl nicht gefunden"

'128' : Ungültiges Argument für exit

'128+n' : Fatale Fehlermeldung "n"

'130' : Skript abgebrochen durch Ctrl + C

'255' : Exit-Status außerhalb des Bereichs

Das ist für Bash. Für andere Anwendungen gibt es jedoch andere Exit-Codes.

25voto

Chris Arguin Punkte 11608

Es gibt keine Standard-Exit-Codes, abgesehen von 0 für Erfolg. Ein Wert ungleich Null bedeutet auch nicht unbedingt einen Fehler.

Header-Datei stdlib.h definiert EXIT_FAILURE als 1 und EXIT_SUCCESS als 0, aber das war's auch schon.

Die 11 am Segmentierungsfehler ist interessant, da 11 die Signalnummer ist, die der Kernel verwendet, um den Prozess im Falle eines Segmentierungsfehlers zu beenden. Wahrscheinlich gibt es einen Mechanismus, entweder im Kernel oder in der Shell, der dies in den Exit-Code übersetzt.

24voto

Header-Datei sysexits.h enthält eine Liste von Standard-Exit-Codes. Sie scheint bis mindestens 1993 zurückzugehen und einige große Projekte wie Postfix Ich kann mir also vorstellen, dass es der richtige Weg ist.

Desde el OpenBSD man-Seite:

Laut style(9) ist es keine gute Praxis, exit(3) mit beliebigen Werten aufzurufen, um einen Fehlerzustand beim Beenden eines Programms anzuzeigen. Stattdessen sollten die vordefinierten Exit-Codes von Sysexits verwendet werden, so dass der Aufrufer des Prozesses eine grobe Abschätzung der Fehlerklasse erhalten kann, ohne im Quellcode nachsehen zu müssen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X