<defunct>プロセスとは何ですか。なぜ強制終了されないのですか?


180

クロムブラウザは応答しませんでしたので、私はそれを殺そうとしましたが、プロセスが消える代わりに<defunct>その右側にあり、殺されませんでした:

ここに画像の説明を入力してください

<defunct>プロセスには何があり、なぜそれが殺されないのですか?


3
受け入れられた答えは、「動作kill -9 PIDしない」と述べています。部分的には真実です。実際には、殺すことはできません。また、-9は最後の手段として使用する必要があります。99%の確率で、親プロセスのデフォルトの強制終了はそれを強制終了し、すべての子プロセスを刈り取ります。「デフォルトの強制終了」はSIGTERM(-15)です。-9のファン(SIGKILL)がstackoverflow.com/questions/690415/
マイクS

回答:


172

出力から「無効」が表示されます。これは、プロセスがタスクを完了したか、破損または強制終了したが、子プロセスがまだ実行されているか、これらの親プロセスが子プロセスを監視していることを意味します。この種のプロセスを強制終了するには、kill -9 PIDは機能しません。このコマンドでそれらを殺そうとすることができますが、何度も何度も表示されます。

この無効なプロセスの親プロセスを特定し、強制終了します。これを知るには、次のコマンドを実行します。

ps -ef | grep defunct

UID          PID     PPID       C    STIME      TTY          TIME              CMD
1000       637      27872      0   Oct12      ?        00:00:04 [chrome] <defunct>
1000      1808      1777       0    Oct04     ?        00:00:00 [zeitgeist-datah] <defunct>

次にkill -9 637 27872、無効なプロセスがでなくなったことを確認しps -ef | grep defunctます。


13
「無効な」プロセスを強制終了することはできません。親を殺すことによってのみ、プロセステーブル内のエントリの削除を高速化できます。
jfs 14

57
ppidが1init)の場合はどうなりますか?私はただ待たなければならないでしょうか?
リュック

7
キルを自動化するには、これも行うことができます(出力から切り取るバイトを変更する必要がある場合があります):ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
ウォーレン

3
@warrenありがとう。また、2番目のgrepを実行しないことで、それを少し短くして(imo)シンプルにすることもできます。最初のgrepをgrep [d]efunct同様の値に変更するだけで、一致しなくなります。
Thor84no

4
@warren-SIGKILLを使用しても、無効なプロセスを強制終了することはできません。さらに、kill -9をかなり無差別に使用しています。stackoverflow.com/questions/690415/…を参照してください。死んだ子供を殺したい場合は、次を試してみてくださいparents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs killkill -9必要に応じて、30秒程度後にスクリプトを再実行します。(私は特に殺害を禁止していることに注意してくださいInit
マイクS

60

マニュアルページps(1)は言う

マークされたプロセスは、親がそれらを適切に破棄していないために残って<defunct>いるデッドプロセス(いわゆる「ゾンビ」)です。これらのプロセスはinit(8)、親プロセスが終了すると破棄されます。

すでに死んでいるので、それを殺すことはできません。残っているのは、プロセステーブルのエントリのみです。

UnixおよびUnixライクなコンピューターオペレーティングシステムでは、ゾンビプロセスまたは機能しないプロセスは、実行は完了したがプロセステーブルにエントリが残っているプロセスです。このプロセスは、親プロセスが子プロセスの終了ステータスを読み取るために必要です。

それらの多くがない限り、そのようなプロセスを許可しても害はありません。ゾンビは最終的にその親によって(を呼び出すことでwait(2))刈り取られます。元の親が自身の終了前にそれを刈り取っていない場合、initプロセス(pid == 1)は後でそれを行います。ゾンビプロセスは次のとおりです。

終了し、終了ステータスがそのプロセスの終了を待機している別のプロセスに報告されたときに削除されるプロセス。


1

Mike Sに感謝します。私たちはあなたの行を取り、親がin.telnetdである無効なプロセスを殺すスクリプトを書きました。親プロセスを殺したくはありません。問題を引き起こしていることがわかっているtelnetdだけで、必要に応じて複数回実行して、複数のプロセスを殺します。

# egrep -v '^1$ = Make sure the process is not the init process.
# awk '{print $3}' = Print the parent process.

first_parent_of_first_dead_kid=$(ps -ef | grep [d]efunct | awk '{print $3}' | head -n1 | egrep -v '^1$')
echo "$first_parent_of_first_dead_kid"

# If the first parent of the first dead kid is in.telnetd, then kill it.
if ps -ef | grep $first_parent_of_first_dead_kid | grep in.telnetd;then
        echo "We have a defunct process whose parent process is in.telnetd" | logger -t KILL-DEFUNCT-TELNET
        echo "killing $first_parent_of_first_dead_kid" | logger -t KILL-DEFUNCT-TELNET
        kill $first_parent_of_first_dead_kid 2>&1 | logger -t KILL-DEFUNCT-TELNET
fi

1

パディントンの答えを拡大

出力からdefunctが表示されます。これは、このプロセスがタスクを完了したか、破損または強制終了したことを意味します。その親プロセスはまだ実行中であり、その死んだ子に気付いていません。

kill -9 PID 動作しません(すでに死んでいます)。

この子プロセスの親を特定するには、次のコマンドを実行します。

ps -ef | grep defunct

 UID  PID **PPID** C STIME TTY TIME     CMD
 1000 637  27872   0 Oct12 ?   00:00:04 [chrome] <defunct>

親が誰であるかを確認します。 ps ax | grep 27872

あなたが望むなら、あなたは親を殺すことができます、そして、死んだ人はなくなります。 kill -9 27872

より技術的な理由については、JFセバスチャンの回答を参照してください。


1

@ Paddington's answerに加えて、この機能をbashrcに追加して、簡単に確認できるようにしました。

defunct(){
    echo "Children:"
    ps -ef | head -n1
    ps -ef | grep defunct
    echo "------------------------------"
    echo "Parents:"
    ppids="$(ps -ef | grep defunct | awk '{ print $3 }')"
    echo "$ppids" | while read ppid; do
        ps -A | grep "$ppid"
    done
}

次のようなものを出力します。

子供達:
UID PID PPID C STIME TTY TIME CMD
ユーザー25707 25697 0 2月26日pts / 0 00:00:00 [sh] 
ユーザー30381 29915 0 11:46 pts / 7 00:00:00 grepの機能停止
------------------------------
親:
25697ポイント/ 0 00:00:00 npm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.