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`.
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).