Odpověď na otázku číslo 1:
Když proces vytvoří podřízené procesy, každý z nich má svůj vlastní PID. PPID každého potomka (id nadřazeného procesu) je PID jejich nadřazeného procesu. Pokud rodič zemře, potom podřízené procesy osiří. Osiřelé procesy jsou automaticky sbírány procesem inicializace systému, který má PID 1.
Problém
Váš skript pravděpodobně vytváří zombie kvůli vašemu kill -9
příkazy; jak je navrženo z odpovědi jjlin, také není nikdy dobrým zvykem náhle zabít nějaký proces, aniž byste k tomu byli nuceni.
Od man bash
můžeme číst:
Procesy označené
jsou mrtvé procesy (takzvané "zombie ), které zůstanou, protože je jejich rodič řádně nezničil .Tyto procesy budou zničeny init(8) pokud se nadřazený proces ukončí.
Odpověď č. 1: Proces spustí má PID 1 a proto jim Linux přiřadí rodiče s PID 1 (protože jim přiřadí init ).
Odpověď č. 2: Nelze je zabít jednoduše protože jsou prostě mrtví ... pokud je jejich rodič init
pravděpodobně stačí chvíli počkat.
Chcete-li odstranit zombíky ze systému, signál SIGCHLD může být odeslán rodičovi ručně pomocí příkazu kill. Pokud nadřazený proces stále odmítá sklízet zombie, dalším krokem by bylo odstranění nadřazeného procesu. Když proces ztratí svého rodiče, init se stane jeho novým rodičem. Init pravidelně provádí systémové volání wait, aby sklidilo všechny zombie s init jako rodičem. [1]
Pro případ, že by se jednoho dne objevila tato myšlenka:do #kill -9 init
proces s oprávněním root je software ekvivalentní fyzickému odpojení počítače od elektrické sítě. [:-)]
Nicméně zombie procesy lze identifikovat ve výstupu ps
příkaz přítomností "Z" v STAT sloupec. K jejich snadné identifikaci můžete použít následující řádek
ps -aux | grep Z
Některé odkazy na Linuxový svět zombie :
- Existuje nějaký způsob, jak zabít proces zombie bez restartu?
- Co jsou procesy zombie
- Jak zabít proces zombie
- [1] Z mnoha zdrojů na internetu