GNU/Linux >> Znalost Linux >  >> Linux

Co dělá program, když je odeslán signál Sigkill?

Když jsem použil killall -9 name zabít program, stát se zombie. O několik minut později to opravdu přestalo.
Co se tedy během těch minut děje?

Přijatá odpověď:

Program ve skutečnosti nikdy nepřijme signál SIGKILL, protože SIGKILL je plně řízen operačním systémem/kernelem.

Když je odeslán SIGKILL pro konkrétní proces, plánovač jádra okamžitě přestane dávat tomuto procesu další CPU čas na spuštění kódu v uživatelském prostoru. Pokud má proces v době, kdy plánovač toto rozhodnutí provede, nějaká vlákna provádějící kód uživatelského prostoru na jiných CPU/jádrech, tato vlákna budou také zastavena. (V jednojádrových systémech to bývalo mnohem jednodušší:pokud plánovač spouštělo jediné jádro CPU v systému, podle definice nespouštělo proces ve stejnou dobu!)

Pokud proces/vlákno provádí kód jádra (např. systémové volání nebo I/O operaci spojenou se souborem mapovaným v paměti) v době SIGKILL, bude to trochu složitější:pouze některá systémová volání jsou přerušitelná, takže jádro interně označí proces jako ve speciálním „umírajícím“ stavu, dokud nebudou vyřešena systémová volání nebo I/O operace. Čas procesoru k jejich vyřešení bude naplánován jako obvykle. Přerušitelná systémová volání nebo I/O operace zkontrolují, zda proces, který je volal, neutichá na vhodných bodech zastavení, a v takovém případě se předčasně ukončí. Nepřerušitelné operace budou dokončeny a těsně před návratem do kódu uživatelského prostoru zkontrolují stav „umírání“.

Jakmile jsou všechny rutiny jádra během procesu vyřešeny, stav procesu se změní z „umírající“ na „mrtvý“ a jádro jej začne čistit, podobně jako když se program normálně ukončí. Jakmile bude čištění dokončeno, bude přiřazen výsledný kód větší než 128 (který označuje, že proces byl zabit signálem; chaotické podrobnosti viz tato odpověď) a proces přejde do stavu „zombie“. . Rodič zabitého procesu bude upozorněn signálem SIGCHLD.

V důsledku toho samotný proces nikdy nedostane příležitost skutečně zpracovat informace, které obdržel SIGKILL.

Když je proces ve stavu „zombie“, znamená to, že je již mrtvý, ale jeho nadřazený proces to ještě nepotvrdil přečtením výstupního kódu mrtvého procesu pomocí wait(2) systémové volání. V podstatě jediným zdrojem, který zombie proces spotřebovává, je slot v tabulce procesů, který obsahuje jeho PID, výstupní kód a některé další „důležité statistiky“ procesu v době jeho smrti.

Související:Stav a závislosti služby Solaris?

Pokud nadřazený proces zemře dříve, než jeho potomci, osiřelé podřízené procesy jsou automaticky adoptovány PID #1, který má zvláštní povinnost neustále volat wait(2) takže žádné osiřelé procesy nezůstanou jako zombie.

Pokud trvá několik minut, než se proces zombie vyčistí, znamená to, že rodič proces zombie bojuje nebo nedělá svou práci správně.

Je tam namyšlený popis toho, co dělat v případě problémů se zombiemi v operačních systémech podobných Unixu:„Pro samotné zombie nemůžete nic udělat, protože jsou již mrtví. Místo toho zabijte zlého mistra zombie! “ (tj. rodičovský proces problémových zombie)


Linux
  1. Co když ‚kill -9‘ nefunguje?

  2. Co znamená &na konci linuxového příkazu?

  3. Co se stane, když se vlákno rozvětvuje?

  1. Co způsobuje odesílání různých signálů?

  2. Co se stane, když pošlete SIGKILL do Zombie Process v Linuxu?

  3. Může mít proces vlastníka? Co to znamená?

  1. Co znamená ve výstupu Ps?

  2. Co dělat, když Ctrl + C nemůže zabít proces?

  3. Co znamená zabít -3?