GNU/Linux >> Znalost Linux >  >> Linux

Co když ‚kill -9‘ nefunguje?

Mám proces, který nemohu zabít pomocí kill -9 <pid> . Jaký je problém v takovém případě, zvláště když jsem vlastníkem tohoto procesu. Myslel jsem, že tomu kill nemůže nic uniknout možnost.

Přijatá odpověď:

kill -9 (SIGKILL) vždy funguje, pokud máte oprávnění proces ukončit. V zásadě buď musíte proces spustit vy a nesmí být setuid nebo setgid, nebo musíte být root. Existuje jedna výjimka:ani root nemůže poslat fatální signál do PID 1 (init proces).

Nicméně kill -9 není zaručeno, že bude fungovat okamžitě . Všechny signály, včetně SIGKILL, jsou doručovány asynchronně:jádru může chvíli trvat, než je doručí. Doručení signálu obvykle trvá nanejvýš několik mikrosekund, pouze čas, za který cíl získá časový úsek. Pokud však cíl zablokoval signál, bude signál zařazen do fronty, dokud jej cíl neodblokuje.

Normálně procesy nemohou blokovat SIGKILL. Ale kód jádra může a procesy spustit kód jádra, když volají systémová volání. Kód jádra blokuje všechny signály, když by přerušení systémového volání mělo za následek špatně vytvořenou datovou strukturu někde v jádře, nebo obecněji porušení některého invariantu jádra. Pokud se tedy (kvůli chybě nebo špatnému návrhu) systémové volání donekonečna zablokuje, nemusí existovat žádný způsob, jak proces zastavit. (Ale proces bude bude zabit, pokud někdy dokončí systémové volání.)

Proces zablokovaný v systémovém volání je v nepřerušitelném spánku. ps nebo top příkaz to (na většině unixů) zobrazí ve stavu D (původně pro „d isk“, myslím).

Klasickým případem dlouhého nepřerušitelného spánku jsou procesy přistupující k souborům přes NFS, když server neodpovídá; moderní implementace obvykle nevynucují nepřerušitelný spánek (např. v Linuxu intr mount umožňuje signál k přerušení přístupu k souborům NFS).

Pokud proces zůstane v nepřerušitelném spánku po dlouhou dobu, můžete získat informace o tom, co dělá tím, že k němu připojíte debugger, spustíte diagnostický nástroj, jako je strace nebo dtrace (nebo podobné nástroje, v závislosti na vašem unixovém stylu), nebo s dalšími diagnostickými mechanismy, jako je /proc/PID/syscall pod Linuxem. Další diskuzi o tom, jak prozkoumat proces v nepřerušitelném spánku, najdete v části Nelze zabít proces wget pomocí `kill -9`.

Související:Jak funguje licence pro open source framework LGPL?

Někdy můžete vidět položky označené Z (nebo H pod Linuxem, nevím, jaký je rozdíl) v ps nebo top výstup. Technicky to nejsou procesy, jsou to zombie procesy, které nejsou ničím jiným než záznamem v tabulce procesů, uchovávaným kolem, aby nadřazený proces mohl být informován o smrti svého potomka. Odejdou, když nadřazený proces věnuje pozornost (nebo zemře).


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

  2. Co znamená zabít -3?

  3. Co dělá zabít -- -0?

  1. Co je webový server a jak webový server funguje?

  2. Linux – Kdy nemám zabít -9 A proces?

  3. Linux – Proč Setuid nefunguje?

  1. Proč „ukončit &“ nefunguje?

  2. Co je DNS a jak funguje?

  3. Co zabilo můj proces a proč?