Kdy systém odešle SIGTERM do procesu?

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

  • Mohu ' nemysli na žádný případ, kdy by jádro nebo standardní nástroj poslal SIGTERM náhodnému procesu. Co nám můžete říct o tom, co program dělá a jak ' s začal? Jak jste se dozvěděli o stavu ukončení programu '? Dokážete problém reprodukovat? Máte protokoly, které můžete zkontrolovat?
  • Čte a zapisuje na sériovou linku a odpovídá na požadavky UDP a TCP. Zabalil jsem provedení do bash skriptu, a proto znám výstupní kód.
  • Dokumentace Posix naznačuje, že SIGTERM je striktně událost na úrovni uživatele. Je možné, že někdo jiný dokázal zabít váš serverový program?
  • Jste! Návratový kód 0 znamená normální výstup. Pokud by existoval SIGTERM, $? by byl nastaven na 143 (128 + číslo signálu).
  • Také ^ C je SIGINT, ne SIGTERM, a to by ukončete s kódem 130.

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.

V prostředí je 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 skořápek je tato hodnota 128 plus číslo signálu; ATT ksh používá 256 + číslo signálu a yash používá 384 + číslo signálu, čímž se vyhne nejednoznačnost, ale ostatní skořápky ji „nevyhovovaly).

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

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.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *