Czy są jakieś standardowe kody statusu wyjścia w Linuksie?

Proces jest uważany za prawidłowo zakończony w Linuksie, jeśli jego status zakończenia wynosił 0.

Widziałem, że błędy segmentacji często skutkują statusem wyjścia 11, choć Nie wiem, czy jest to po prostu Konwencja, w której pracuję (aplikacje, które zawiodły w ten sposób, wszystkie były wewnętrzne) czy standard.

Czy istnieją standardowe kody zakończenia procesów w Linuksie?

Author: codeforester, 2009-07-09

10 answers

8 bitów kodu zwrotnego i 8 bitów numeru sygnału killing są mieszane w jedną wartość po powrocie z 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" */
}

Jak określasz status wyjścia? Tradycyjnie powłoka przechowuje tylko 8-bitowy kod powrotu, ale ustawia wysoki bit, jeśli proces został nieprawidłowo zakończony.

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

Jeśli widzisz coś innego niż to, to program prawdopodobnie ma funkcję obsługi sygnału SIGSEGV, która następnie wywołuje exit normalnie, więc nie jest właściwie giną przez sygnał. (Programy mogą wybrać obsługę dowolnych sygnałów poza SIGKILL i SIGSTOP.)

 80
Author: ephemient,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-25 11:59:44

Część 1: Advanced Bash Scripting Guide

Jak zawsze, Advanced Bash Scripting Guide zawiera świetne informacje : (Zostało to połączone w innej odpowiedzi, ale z niekanonicznym adresem URL.)

1: Catchall dla błędów ogólnych
2: nadużycie wbudowanych powłok (zgodnie z dokumentacją Bash)
126: wywołane polecenie nie może zostać wykonane
127: "nie znaleziono polecenia"
128: nieprawidłowy argument do wyjście
128+n: Fatal error signal "n"
255: Exit status out of range (exit pobiera tylko liczby całkowite args z zakresu 0 - 255)

Część 2: sysexits.h

Odniesienia do ABSG sysexits.h.

Na Linuksie:

$ 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 */
 316
Author: Schof,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-24 20:13:59

'1' >>> Catchall dla błędów ogólnych

'2' >>> Używanie wbudowanych powłok (zgodnie z dokumentacją Bash)

'126'>>> wywołane polecenie nie może wykonać

'127'>>>"command not found"

'128'>>> Invalid argument to exit

'128+n' > > > Fatal error signal " n "

'130'>>> skrypt zakończony kontrolką-C

'255'>>>Exit status out of range

To jest dla Basha. Jednak w przypadku innych aplikacji istnieją różne kody zakończenia.

 67
Author: segfault,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-11 13:15:20

Żadna ze starszych odpowiedzi nie opisuje poprawnie statusu wyjścia 2. W przeciwieństwie do tego, co twierdzą, status 2 jest tym, co twoje narzędzia wiersza poleceń zwracają, gdy są niewłaściwie wywołane. (Tak, odpowiedź może mieć dziewięć lat, mieć setki pozytywnych głosów i nadal się mylić.)

Oto prawdziwa, długotrwała Konwencja o statusie zakończenia dla normalnego zakończenia, tzn. nie za pomocą sygnału:

  • Status wyjścia 0: sukces
  • Exit status 1: "failure", zgodnie z definicją program
  • Status wyjścia 2: błąd użycia wiersza poleceń

Na przykład, diff zwraca 0, jeśli porównywane pliki są identyczne, a 1, jeśli różnią się. Zgodnie z wieloletnią konwencją, programy uniksowe zwracają exit status 2, gdy wywołane są nieprawidłowo (nieznane opcje ,Niewłaściwa liczba argumentów, itp.) na przykład, diff -N, grep -Y lub diff a b c spowoduje, że $? zostanie ustawione na 2. Jest to i jest praktyką Od początku istnienia Uniksa w latach 70.]}

The accepted answer wyjaśnia, co się dzieje, gdy polecenie jest zakończone sygnałem. krótko mówiąc, zakończenie z powodu nieotrzymanego sygnału powoduje status zakończenia 128+[<signal number>. Np. wypowiedzenie przez SIGINT (sygnał 2 ) daje status wyjścia 130.

Uwagi

  1. Kilka odpowiedzi definiuje status wyjścia 2 jako "niewłaściwe użycie wbudowanych bash". Dotyczy to tylko sytuacji, gdy bash (lub skrypt bash) zakończy działanie ze statusem 2. Uznaj to za Szczególny przypadek nieprawidłowy błąd użytkowania.

  2. W sysexits.h, wspomniany w najpopularniejszej odpowiedzi , status zakończenia EX_USAGE ("błąd użycia wiersza poleceń") jest zdefiniowany jako 64. Ale to nie odzwierciedla rzeczywistości: nie jestem świadomy żadnego wspólnego narzędzia uniksowego, które zwraca 64 po nieprawidłowym wywołaniu (przykłady mile widziane). W 2007 roku, w wyniku połączenia się z firmą, w 2008 roku, firma została założona przez firmę, która została założona w 2009 roku.]}

     *    This include file attempts to categorize possible error
     *    exit statuses for system programs, notably delivermail
     *    and the Berkeley network.
    
     *    Error numbers begin at EX__BASE [64] to reduce the possibility of 
     *    clashing with oth­er exit statuses that random programs may 
     *    already return. 
    

    W innymi słowy, definicje te nie odzwierciedlają powszechnej praktyki w tym czasie (1993), ale były z nią celowo niezgodne. Szkoda.

 39
Author: alexis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-28 07:49:49

Nie ma standardowych kodów wyjścia, poza 0 oznaczającym sukces. Niezerowa nie musi też oznaczać porażki.

Stdlib.h definiuje {[0] } jako 1 i {[1] } jako 0, ale to wszystko.

11 na segfault jest interesujące, ponieważ 11 jest numerem sygnału, którego jądro używa do zabicia procesu w przypadku segfault. Prawdopodobnie istnieje jakiś mechanizm, zarówno w jądrze, jak i w powłoce, który przekłada to na kod wyjścia.
 22
Author: Chris Arguin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 05:36:54

Sysexits.h posiada listę standardowych kodów wyjścia. Wydaje się, że pochodzi z co najmniej 1993 roku i niektóre duże projekty, takie jak Postfix, używają go, więc wyobrażam sobie, że jest to droga do zrobienia.

Ze strony man OpenBSD:

Zgodnie z style(9), nie jest dobrą praktyką wywoływanie exit (3) z arbi- wartości trary wskazujące stan awarii podczas kończenia programu. W- zamiast tego należy użyć predefiniowanych kodów wyjścia z sysexits, więc rozmówca procesu może uzyskać przybliżoną wycenę o klasie niepowodzeń bez sprawdzania kodu źródłowego.
 20
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 05:56:47

Dla pierwszego przybliżenia, 0 jest sukcesem, niezer jest porażką, przy czym 1 jest ogólną porażką, a wszystko większe od jednego jest konkretną porażką. Oprócz trywialnych WYJĄTKÓW false I test, które są zaprojektowane tak, aby dać 1 za sukces, jest kilka innych wyjątków, które znalazłem.

Bardziej realistycznie, 0 oznacza sukces, a może porażkę, 1 oznacza ogólną porażkę, a może sukces, 2 oznacza ogólną porażkę, jeśli 1 i 0 są używane do sukcesu, ale może również.

Polecenie diff daje 0, jeśli porównywane pliki są identyczne, 1, jeśli różnią się, i 2, jeśli pliki binarne są różne. 2 oznacza również porażkę. Polecenie less daje 1 za niepowodzenie, chyba że nie podasz argumentu, w którym to przypadku, kończy 0 pomimo niepowodzenia.

Polecenie more i polecenie spell dają 1 za niepowodzenie, chyba że niepowodzenie jest wynikiem odmowy uprawnień, nieistniejącego pliku lub próby odczytania katalogu. W każdym z tych przypadków opuszczają 0 pomimo porażka.

Wtedy polecenie expr daje 1 dla sucess, chyba że wyjściem jest pusty łańcuch lub zero, w którym to przypadku 0 jest sucess. 2 i 3 to porażka.

Są przypadki, w których sukces lub porażka jest niejednoznaczna. Gdy grep nie znajdzie wzorca, wychodzi z 1, ale wychodzi z 2 z powodu prawdziwej awarii (np. Odmowa uprawnień). Klist wychodzi również z 1, gdy nie znajdzie biletu, chociaż nie jest to tak naprawdę żadna porażka, niż gdy grep nie znajdzie wzorca, lub gdy jest pusty katalog.

Tak więc, niestety, unixowe uprawnienia, które be wydają się nie wymuszać żadnego logicznego zestawu reguł, nawet na bardzo często używanych plikach wykonywalnych.

 8
Author: Frederick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-10 05:20:49

Programy zwracają 16-bitowy kod wyjścia. JeĹ "li program zostaĹ' zabity sygnaĹ 'em, to bajt wysokiego rzÄ ... du zawiera uĺźywany sygnaĹ', w przeciwnym razie bajt niskiego rzÄ ... du jest statusem koĹ " ca zwracanym przez programistÄ™.

Jak kod zakończenia jest przypisany do zmiennej statusowej $? jest wtedy do skorupy. Bash zachowuje dolne 7 bitów stanu, a następnie używa 128 + (signal nr) do wskazywania sygnału.

Jedyną "standardową" konwencją dla programów jest 0 dla sukcesu, niezerowa dla błędu. Inną używaną konwencją jest zwracanie errno w przypadku błędu.

 5
Author: Dean Povey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 05:48:39

Standardowe Unixowe kody wyjścia są definiowane przez sysexits.h, jak wspominał inny plakat. Te same kody wyjścia są używane przez przenośne biblioteki, takie jak Poco - oto ich lista:

Http://pocoproject.org/docs/Poco.Util.Application.html#16218

Sygnał 11 jest sygnałem SIGSEGV (segment violation), który różni się od kodu zwrotnego. Sygnał ten jest generowany przez jądro w odpowiedzi na zły dostęp do strony, co powoduje zakończenie programu. Lista sygnałów może znaleźć na stronie Man signal (Uruchom "Man signal").

 3
Author: Daniel Schuler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 06:54:02

Gdy Linux zwraca 0, oznacza to sukces. Wszystko inne oznacza awarię, każdy program ma swoje własne kody wyjścia, więc lista ich wszystkich byłaby dość długa... !

Jeśli chodzi o kod błędu 11, jest to rzeczywiście numer błędu segmentacji, co głównie oznacza, że program uzyskał dostęp do lokalizacji pamięci, która nie została przypisana.

 2
Author: Amadeus45,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-09 05:28:05