Prześlę to jako odpowiedź, aby istniało jakieś rozwiązanie, jeśli okaże się, że to jest problem.
Status wyjścia 0 oznacza normalne wyjście z udanego programu. Program wychodzenia można wybrać dowolną liczbę całkowitą z przedziału od 0 do 255, jak jej status wyjścia. Konwencjonalnie programy używają małych wartości. Powłoki używają wartości 126 i wyższych do zgłaszania specjalnych warunków, więc najlepiej ich unikać.
Na poziomie C API programy zgłaszają status 16-bitowy¹, który koduje zarówno status wyjścia programu, jak i sygnał, który go zabił, jeśli taki istnieje.
W powłoce status wyjścia komendy (zapisany w $?
) łączy rzeczywisty status wyjścia programu z wartością sygnału: jeśli program zostanie zabity przez sygnał, $?
zostanie ustawiony na wartość większą niż 128 (w przypadku większości powłok wartość ta jest równa 128 plus numer sygnału; ATT ksh używa numeru sygnału 256+, a yash używa numeru sygnału 384 +, co pozwala uniknąć dwuznaczności, ale inne powłoki nie poszły tą samą drogą.
W szczególności, jeśli $?
wynosi 0, program zakończył się normalnie.
Należy zauważyć, że dotyczy to przypadku procesu, który odbiera SIGTERM, ale ma dla niego procedurę obsługi sygnału i ostatecznie kończy normalnie (być może jako pośrednią konsekwencję sygnału SIGTERM, a może nie).
Aby odpowiedzieć na pytanie w twoim tytule, SIGTERM nigdy nie jest wysyłany automatycznie przez system. Istnieje kilka sygnałów wysyłanych automatycznie, takich jak SIGHUP, gdy terminal znika, SIGSEGV / SIGBUS / SIGILL, gdy proces wykonuje czynności, których nie powinien robić, SIGPIPE, gdy zapisuje do uszkodzonej rury / gniazda itp. I są kilka sygnałów wysyłanych z powodu naciśnięcia klawisza w terminalu, głównie SIGINT dla Ctrl+ C, SIGQUIT dla Ctrl+ \i SIGTSTP dla Ctrl+ Z, ale SIGTERM nie jest jednym z nich. Jeśli proces odbiera SIGTERM, jakiś inny proces wysłał ten sygnał.
¹ z grubsza mówiąc