GNU/Linux >> Znalost Linux >  >> Linux

Kdy systém odešle SIGTERM procesu?

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.


Linux
  1. UNIX / Linux:3 způsoby odesílání signálu do procesů

  2. Jaký je nejlepší způsob, jak vyslat signál všem členům procesní skupiny?

  3. Co dělá systémové volání brk()?

  1. Jak Unix sleduje pracovní adresář uživatele při navigaci v systému souborů?

  2. Jak mohu v Linuxu zjistit, který proces poslal mému procesu signál

  3. Proč rozvětvení mého procesu způsobuje nekonečné čtení souboru

  1. Nový rodičovský proces, když rodičovský proces zemře?

  2. Co znamená ve výstupu Ps?

  3. Linux – Může Ctrl+c odeslat signál Sigint více procesům?