chromeブラウザーは応答しなかったため、強制終了しようとしましたが、プロセスを非表示にする代わりに、右側に<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
によって無効なプロセスがなくなったことを確認します。
<defunct>
とマークされたプロセスは、親が適切に破棄していないために残るデッドプロセス(いわゆる"zombies")です。親プロセスが終了すると、これらのプロセスは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が表示されます。これは、このchildプロセスがタスクを完了したか、破損または強制終了したことを意味します。その親プロセスはまだ実行中であり、その死んだ子に気付いていません。
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
より技術的な理由については、J.F。Sebastianの回答をご覧ください。
@ 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 user 25707 25697 0 Feb26 pts/0 00:00:00 [sh] user 30381 29915 0 11:46 pts/7 00:00:00 grep defunct ------------------------------ 親: 25697 pts/0 00:00:00 npm