Můj serverový program přijal SIGTERM a zastavil se (s ukončovacím kódem 0). Jsem tím překvapen, protože jsem si docela jistý, že na to bylo dost paměti. Za jakých podmínek linux (busybox) pošle SIGTERM procesu?
Komentáře
Odpovědět
Zveřejním to jako odpověď, takže že existuje nějaký druh řešení, pokud se ukáže, že jde o problém.
Stav ukončení 0 znamená normální ukončení úspěšného programu. Ukončovací program může jako stav ukončení zvolit jakékoli celé číslo od 0 do 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 i signál, který jej zabil, pokud existuje.
Zejména pokud je $?
0, váš program byl ukončen normálně.
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 normálně skončí (možná jako nepřímý důsledek signálu SIGTERM, možná ne).
Chcete-li odpovědět na otázku ve svém názvu, systém SIGTERM nikdy neposílá automaticky. Existuje několik signálů, které se odesílají automaticky, například SIGHUP, když terminál zmizí, SIGSEGV / SIGBUS / SIGILL, když proces dělá věci, které by neměl dělat, SIGPIPE, když zapisuje na poškozené potrubí / zásuvku atd. A existují několik signálů, které jsou vysílány po stisknutí klávesy v terminálu, hlavně SIGINT pro Ctrl + C , SIGQUIT pro Ctrl + \ a SIGTSTP pro Ctrl + Z , ale SIGTERM není jedním z nich. Pokud proces přijímá SIGTERM, odeslal tento signál nějaký jiný proces.
¹ hrubě řečeno
Komentáře
- Pěkné vysvětlení, jak se určuje stav ukončení po přijetí signálu. Tato odpověď však ' t neřeší otázku OP '.
- @codeforester Na otázku jsem odpověděl v tělo, ne otázka v nadpisu. No, jedna z otázek v těle – vzhledem k tomu, že to bylo založeno na nedorozumění, je trochu chaotický. I ' Ke zbytku přidám několik slov.
- To záleží na prostředí. V ksh93 je to ' s 256 + signum, v yash ' s 384 + signum
- použití hodnoty nad 256 a la ksh nemusí být nutně lepší, protože to zabrání jejímu předání
exit
. Přístupyash
je dobrým kompromisem, ale viz rc pro jiný. Viz také Výchozí kód ukončení, když je proces ukončen?
Odpovědět
SIGTERM je signál, který se obvykle používá k administrativnímu ukončení procesu.
To není signál, který by jádro odeslalo, ale to je signál, který by proces obvykle Odeslat k ukončení (elegantně) jiného procesu.
To je signál, který je standardně odesílán kill
, pkill
, killall
… příkazy.
To je signál, který je odeslán démonům, aby je zastavil (jako na service some-service stop
), nebo odeslaný init
před vypnutím (následuje SIGKILL pro procesy, které se nestihly včas ukončit při SIGTERM).
Všimněte si, že SIGTERM není signál, který je odesílán po ^C
. Signál odeslaný při ^C
je SIGINT.
$?
by byl nastaven na 143 (128 + číslo signálu).