Umístím to jako odpověď, aby existovalo nějaké řešení, pokud se ukáže, že jde o tento problém.
Stav ukončení 0 znamená normální ukončení úspěšného programu. Ukončující program si může jako stav ukončení zvolit libovolné celé číslo mezi 0 a 255. Programy obvykle používají malé hodnoty. Hodnoty 126 a vyšší používá shell k hlášení zvláštních podmínek, takže je nejlepší se jim vyhnout.
Na úrovni C API programy hlásí 16bitový stav¹, který kóduje jak stav ukončení programu, tak signál, který jej zabil, pokud existuje.
V shellu stav ukončení příkazu (uložený v $?
) spojuje skutečný stav ukončení programu a hodnotu signálu:pokud je program zabit signálem, $?
je nastavena na hodnotu větší než 128 (u většiny shellů je tato hodnota 128 plus číslo signálu; ATT ksh používá 256 + číslo signálu a yash používá 384 + číslo signálu, což zabraňuje nejednoznačnosti, ale ostatní shelly nenásledovaly oblek).
Zejména pokud $?
je 0, váš program se normálně ukončil.
Všimněte si, že to zahrnuje případ procesu, který přijímá SIGTERM, ale má pro něj obslužný program signálu a nakonec se normálně ukončí (možná jako nepřímý důsledek signálu SIGTERM, možná ne).
Abychom odpověděli na otázku ve vašem nadpisu, systém SIGTERM nikdy neposílá automaticky. Existuje několik signálů, které se odesílají automaticky, jako je SIGHUP, když terminál odejde, SIGSEGV/SIGBUS/SIGILL, když proces dělá věci, které by dělat neměl, SIGPIPE, když zapisuje do rozbité trubky/zásuvky atd. několik signálů, které jsou odeslány stisknutím klávesy v terminálu, hlavně SIGINT pro Ctrl +C , SIGQUIT pro Ctrl +\ a SIGTSTP pro Ctrl +Z , ale SIGTERM mezi ně nepatří. Pokud proces přijme SIGTERM, nějaký jiný proces poslal tento signál.
¹ zhruba řečeno
SIGTERM je signál, který se obvykle používá k administrativnímu ukončení procesu.
To není signál, který by jádro vyslalo, ale je to signál, který by proces obvykle vyslal, aby (slušně) ukončil jiný proces.
To je signál, který standardně odesílá kill
, pkill
, killall
... příkazy.
To je signál, který se posílá démonům, aby je zastavili (jako u service some-service stop
), nebo zaslané init
před vypnutím (následuje SIGKILL pro ty procesy, které se nepodařilo ukončit včas po SIGTERM).
Upozorňujeme, že SIGTERM není signál, který je odeslán po ^C
. Signál odeslaný po ^C
je SIGINT.