ゾンビプロセスを見つける方法は?


100
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
a@SERVER:~$ 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
a@SERVER:~$ 

そのゾンビプロセスを見つける方法は?


なぜシステムモニターを開いてゾンビプロセスを検索しないのですか?
dlin

8
ヘッドレスno-Xサーバーでそれを行う方法は?
-SabreWolfy

2
驚くべきことに、以下の回答には、上記の出力に基づいて、システムにゾンビプロセスがないことが実際に記載されています。本当にある場合、ps auxwww | grep 'Z'コマンドはZ状態のプロセスを示しているはずです。「システム情報」という言葉=> There is 1 zombie process.はバグのようです。それか、質問に情報が欠けています。
アリエル

回答:


126

ゾンビ(プロセス)を殺すには、その親プロセス(本当のゾンビのように!)を殺さなければなりませんが、問題はそれを見つける方法でした。

ゾンビを見つける(質問はこのパートに回答しました):

a@SERVER:~$ ps aux | grep 'Z'

あなたが得るものはゾンビとその中にZを持つ他のものですので、あなたはまた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

ゾンビの親を見つけます:

a@SERVER:~$ pstree -p -s 93572

あなたに与えます:

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

この場合、その親プロセスを強制終了したくないため、1つのゾンビに非常に満足している必要がありますが、直接の親プロセス5145を強制終了すると削除されます。

askubuntuに関する追加リソース:


1
答えに表示される結果は、ゾンビプロセスではなく、grepコマンド自体です。これは、パブロが彼の答えで行ったのと同じ誤解釈です。以下のRinzwindによる答えは、実際にゾンビプロセスを探してリストしています。別のオプションは、「現存しない」をgrepすることができ
FVD

pstree -H your_desired_pid -p
グレッグM.クルサック14

ディスカッションに追加してくれたGregに感謝しますが、これはヘルプサイトであることを覚えておいてください。何も説明せずにコマンドを貼り付けるだけでは、ヘルプを求めてここに来るほとんどの人にとっては役に立ちません。
ダンカンムー14

1
これは素晴らしい答えです!今日でも有効です!ゾンビプロセスを見つけて、親プロセスを問題なく終了することができました。ありがとうございました!
テランス

1
あなたはpstreeコマンドがインストールされていない場合は、ps wauxf同じことを
JDS

35

この質問は古いものですが、誰もがより信頼できる答えに値すると思いました。

ps axo pid=,stat=

これにより、空白で区切られた2つの列が生成されます。最初の列はPIDで、2番目の列はその状態です。

GNUでさえps、状態によって直接フィルタリングする方法を提供するとは思わないが、あなたは確実にこれを行うことができるawk

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

これで、ゾンビであるPIDのリストができました。状態がわかっているので、それを表示する必要はもうないので、除外することができます。

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

ゾンビPIDの改行区切りリストを提供します。

これで、単純なシェルループを使用してこのリストを操作できます。

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

ps は強力なツールであり、プロセス情報を取得するために複雑な操作を行う必要はありません。

(異なるプロセス状態の意味はこちら-https://unix.stackexchange.com/a/18477/121634


2
awkまた、テキストを分割するだけでなく、一致させることもできる強力なツールです。+1 ... grep不要で不正確な場合に使用される他の人。
0xC0000022L

だから今私はゾンビプロセスのリストを持っています。どうやって殺すの?
チョビー

@chovy:それは依存しますが、一般に親を殺すかシグナルを送ることを含みます。ここでの他の答えはそれに入ります。あなたの上に示されるループ内からは、このような親のpidを見つけることができます:ps -p "$pid" -opid=,ppid=
Sorpigal

親がすべての子プロセスを強制終了しませんか?1つのゾンビプロセスを強制終了したいだけです。私はppidを知っています。
チョビー

1
ppid=オプションリストに追加することをお勧めします。したがって、個別のコマンドを使用してppidを取得する必要はありません。
ディンイーチェン

3

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

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

コメントから改善されたもの:

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;

しかし注意してください:これもプロセスを殺します。


それでも何も返しません。私のやり方も間違っていなかったと思います。
パブロ

2番目の例は非常に信頼性が低く、前者は不必要に冗長です(ps axo pid=,stat= | awk '$2~/Z/ {print $1}'代わりに試してください)。
ソルピガル

3

しかし、少ないほど多い:

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

それは、すべてのユーザーのプロセスのフォレスト(ツリー)を任意のttyで無制限の幅を持つユーザー指向の形式で提供し、8番目の列にZが含まれる場合と一致する画面の上の半分で表示します。行全体を強調しないのはなぜですか。

ユーザー指向のフォーマットは次のことを意味しているようです。 USER, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME, COMMANDしたがって、ゾンビのステータスは8列目に表示されます。

行番号が必要な場合はN前に、一致でアスタリスクが必要な場合はpa をスローできJます。悲しいことにG、アスタリスクが表示されない行を強調表示しないために使用すると、Jスペースが作成されます。

あなたは次のようなものを得ます:

…
  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: lamblin@pts/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.*
…

これをフォローアップすることができます(そして、端末が-U Unicodeまたは-A Asciiを好むかどうかを検出します):

pstree -psS <PID LIST>

または、上矢印を使用しlessて、階層全体でそのツリー/フォレストをたどります。これは、「より少ない」アプローチで推奨していたことです。


0

次のコマンドをお勧めします。

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

aux必要な文字列を使用-oして正確に要求できる場合、文字列を使用したり変更したりすることは不必要に信頼できません。ps ax -o pid=,stat= | awk '$2 ~ "[Zz]" { printf("%s, PID = %d\n", $2, $1); }'代わりに使用してください。
ソルピガル

-1

プロセスゾンビを一覧表示するには、次のコマンドを試してください。

ps j | awk '$7 ~ "Z"'

$7オペレーティングシステムによっては変更が必要になる場合があります。

これは、親プロセスID(PPID)のリストも返します。

(上記のコマンドをテストした後)ゾンビを殺そうとするには、次を試してください:

kill -9 $(ps j | awk 'NR>1 && $7 ~ "Z" {print $2}')

両親を特定するにはpstree、次のように試してください:

$ ps j | awk 'NR>1 && $7 ~ "T" {print $2}' | xargs -L1 pstree -sg
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2430)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2431)
systemd(1)───sshd(1036)───sshd(2325)───sshd(2325)───bash(2383)───zombie(2432)

このために1つの列をjフォーマットから取り除くことに頼るのは、不必要に複雑です。-o代わりに使用して、必要なものを選択します。
ソルピガル

2
ps jシステム内のすべてのプロセスを印刷しません。現在のユーザープロシージャ(BSDジョブスタイル)のみがリストされているため、ゾンビプロセスを見逃す可能性があります。
アリエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.