web-dev-qa-db-ja.com

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

chromeブラウザーは応答しなかったため、強制終了しようとしましたが、プロセスを非表示にする代わりに、右側に<defunct>があり、強制終了されませんでした。

enter image description here

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

180

出力から「無効」が表示されます。これは、プロセスがタスクを完了したか、破損または強制終了されたが、子プロセスがまだ実行されているか、これらの親プロセスが子プロセスを監視していることを意味します。この種のプロセスを強制終了するには、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によって無効なプロセスがなくなったことを確認します。

171
Paddington

マニュアルページps(1)の説明

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

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

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

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

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

59
jfs

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
David Brazzeal

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

出力から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の回答をご覧ください。

1
kevinf

@ 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 
1