クロムブラウザは応答しませんでしたので、私はそれを殺そうとしましたが、プロセスが消える代わりに<defunct>
その右側にあり、殺されませんでした:
<defunct>
プロセスには何があり、なぜそれが殺されないのですか?
クロムブラウザは応答しませんでしたので、私はそれを殺そうとしましたが、プロセスが消える代わりに<defunct>
その右側にあり、殺されませんでした:
<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>
1000 1808 1777 0 Oct04 ? 00:00:00 [zeitgeist-datah] <defunct>
次にkill -9 637 27872
、無効なプロセスがでなくなったことを確認しps -ef | grep defunct
ます。
1
(init
)の場合はどうなりますか?私はただ待たなければならないでしょうか?
ps -ef | grep defunct | grep -v grep | cut -b8-20 | xargs kill -9
grep [d]efunct
同様の値に変更するだけで、一致しなくなります。
parents_of_dead_kids=$(ps -ef | grep [d]efunct | awk '{print $3}' | sort | uniq | egrep -v '^1$'); echo "$parents_of_dead_kids" | xargs kill
。kill -9
必要に応じて、30秒程度後にスクリプトを再実行します。(私は特に殺害を禁止していることに注意してくださいInit
)
マークされたプロセスは、親がそれらを適切に破棄していないために残って
<defunct>
いるデッドプロセス(いわゆる「ゾンビ」)です。これらのプロセスはinit(8)
、親プロセスが終了すると破棄されます。
すでに死んでいるので、それを殺すことはできません。残っているのは、プロセステーブルのエントリのみです。
UnixおよびUnixライクなコンピューターオペレーティングシステムでは、ゾンビプロセスまたは機能しないプロセスは、実行は完了したがプロセステーブルにエントリが残っているプロセスです。このプロセスは、親プロセスが子プロセスの終了ステータスを読み取るために必要です。
それらの多くがない限り、そのようなプロセスを許可しても害はありません。ゾンビは最終的にその親によって(を呼び出すことでwait(2)
)刈り取られます。元の親が自身の終了前にそれを刈り取っていない場合、init
プロセス(pid == 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
パディントンの答えを拡大
出力から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セバスチャンの回答を参照してください。
@ 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
kill -9 PID
しない」と述べています。部分的には真実です。実際には、殺すことはできません。また、-9は最後の手段として使用する必要があります。99%の確率で、親プロセスのデフォルトの強制終了はそれを強制終了し、すべての子プロセスを刈り取ります。「デフォルトの強制終了」はSIGTERM(-15)です。-9のファン(SIGKILL)がstackoverflow.com/questions/690415/