it-swarm.dev

Jak najít zombie proces?

System information as of Fri Mar  9 19:40:01 KST 2012

  System load:    0.59               Processes:           167
  Usage of /home: 23.0% of 11.00GB   Users logged in:     1
  Swap usage:     0%                 IP address for eth1: 192.168.0.1

  => There is 1 zombie process.

  Graph this data and manage this system at https://landscape.canonical.com/

10 packages can be updated.
4 updates are security updates.

Last login: Fri Mar  9 10:23:48 2012
[email protected]:~$ ps auxwww | grep 'Z'
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
usera     13572  0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
[email protected]:~$ 

Jak najít ten zombie proces?

108
Pablo

Chcete-li zabít zombie (proces), musíte zabít jeho rodičovský proces (stejně jako skutečné zombie!), Ale otázkou bylo, jak jej najít.

Najděte zombie (Otázka odpověděla na tuto část):

[email protected]:~$ ps aux | grep 'Z'

To, co dostanete, jsou zombie a cokoli jiného se Z v něm, takže získáte také grep:

USER       PID     %CPU %MEM  VSZ    RSS TTY      STAT START   TIME COMMAND
usera      13572   0.0  0.0   7628   992 pts/2    S+   19:40   0:00 grep --color=auto Z
usera      93572   0.0  0.0   0      0   ??       Z    19:40   0:00 something

Najděte rodiče zombie:

[email protected]:~$ pstree -p -s 93572

Dá vám:

init(1)---cnid_metad(1311)---cnid_dbd(5145)

V tomto případě nechcete zabít tento rodičovský proces a měli byste být docela spokojeni s jedním zombie, ale zabití okamžitého rodičovského procesu 5145 by se toho mělo zbavit.

Další zdroje na askubuntu:

134
Duncanmoo

I když je tato otázka stará, myslel jsem si, že si všichni zaslouží spolehlivější odpověď:

ps axo pid=,stat=

To vydá dva sloupce oddělené mezerami, z nichž první je PID a druhý je jeho stav.

Nemyslím si, že ani GNU ps poskytuje způsob filtrování podle státu přímo, ale můžete to spolehlivě provést pomocí awk

ps axo pid=,stat= | awk '$2~/^Z/ { print }'

Nyní máte seznam PID, které jsou zombie. Protože znáte stav, není již nutné jej zobrazovat, takže jej lze odfiltrovat.

ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }'

Poskytnutí seznamu PID s zombie oddělenými řádky.

Nyní můžete na tomto seznamu pracovat pomocí jednoduché smyčky Shell

for pid in $(ps axo pid=,stat= | awk '$2~/^Z/ { print $1 }') ; do
    echo "$pid" # do something interesting here
done

ps je výkonný nástroj a nemusíte dělat nic složitého, abyste z něj dostali informace o procesu.

(Význam různých stavů procesu zde - https://unix.stackexchange.com/a/18477/121634 )

37
Sorpigal

Méně je více:

ps afuwwx | less +u -p'^(\S+\s+){7}Z.*'

To je jako, dej mi les (strom) všech uživatelských procesů v uživatelsky orientovaném formátu s neomezenou šířkou na jakémkoli tty a ukaž mi to na půl obrazovky nad místem, kde se shoduje s případem, že 8. sloupec obsahuje Z a proč nezvýraznit celý řádek.

Zdá se, že formát orientovaný na uživatele znamená: USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMAND, takže se v 8. sloupci zobrazí stav zombie.

Pokud chcete čísla řádků, můžete hodit N před p a J, pokud chcete v zápase použít hvězdičku. Bohužel, pokud pomocí G nezvýrazníte řádek, který se hvězdička nezobrazí, ale J pro něj vytvoří prostor.

Nakonec dostanete něco, co vypadá jako:

…
  root      2919  0.0  0.0  61432  5852 ?      Ss Jan24 0:00 /usr/sbin/sshd -D
  root     12984  0.0  0.1 154796 15708 ?      Ss 20:20 0:00  \_ sshd: lamblin [priv]
  lamblin  13084  0.0  0.0 154796  9764 ?      S  20:20 0:00      \_ sshd: [email protected]/0
* lamblin  13086  0.0  0.0  13080  5056 pts/0  Z  20:20 0:00          \_ -bash <defunct>
  lamblin  13085  0.0  0.0  13080  5056 pts/0  Ss 20:20 0:00          \_ -bash
  root     13159  0.0  0.0 111740  6276 pts/0  S  20:20 0:00              \_ su - nilbmal
  nilbmal  13161  0.2  0.0  13156  5004 pts/0  S  20:20 0:00                  \_ -su
  nilbmal  13271  0.0  0.0  28152  3332 pts/0  R+ 20:20 0:00                      \_ ps afuwwx
  nilbmal  13275  0.0  0.0   8404   848 pts/0  S+ 20:20 0:00                      \_ less +u -Jp^(\S+\s+){7}Z.*
…

Ty mohl na to navázat (a zjistí, jestli se vášmu terminálu líbí - U Unicode nebo -A Ascii):

pstree -psS <PID LIST>

NEBO jen, jak víte, použijte šipku nahoru v less, abyste sledovali tento strom/les prostřednictvím hierarchie; což je to, co jsem doporučil s přístupem „Méně je více“.

3
dlamblin

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Od: http://www.cyberciti.biz/tips/killing-zombie-process.html

Z komentářů vylepšený:

for p in $(ps jauxww | grep Z | grep -v PID | awk '{print $3}'); do
    for every in $(ps auxw | grep $p | grep cron | awk '{print $2}'); do
        kill -9 $every;
    done;
done;

Pozor: tento proces také zabíjí.

3
Rinzwind

Navrhuji vám tento příkaz:

ps aux | awk '"[Zz]" ~ $8 { printf("%s, PID = %d\n", $8, $2); }'
0
Peycho Dimitrov