`[Java]`死んだ子供と一緒に - >収集する方法はありますか?

`[Java]`死んだ子供と一緒に - >収集する方法はありますか?

質問と関連:「kill -9」が動作しない場合はどうなりますか?

私は次のような状況にあります。スレッド化されたゾンビプロセスはinitによって収集されません。:

[root@Arch64]# ps auxH | grep java
gwpl       569  0.0  0.0      0     0 ?        Zl   04:23   0:00 [java] <defunct>
gwpl       569  5.5 49.0 1466648 375572 ?      Rl   07:25  23:55 [java] <defunct>
gwpl       569 16.0 49.0 1466648 375572 ?      Rl   12:27  20:54 [java] <defunct>
gwpl       569 17.9 49.0 1466648 375572 ?      Rl   12:47  19:48 [java] <defunct>
root     10466  0.0  0.0   6740   628 pts/0    S+   14:38   0:00 grep java
[root@Arch64]# pstree -s 569
init---java---3*[{java}]

私ができることはありますか?

または内部にコメントに提案されたバグhttps://unix.stackexchange.com/a/11173/9689

これがバグであれば、何を捨てて解決する必要がありますか?


上記のリストでは、次のステータスコードを使用します。Zl、、、。デコード用のチートシートは次のとおりです。RlS+man ps

PROCESS STATE CODES
       (...)
       R    Running or runnable (on run queue)
       S    Interruptible sleep (waiting for an event to complete)
       (...)
       Z    Defunct ("zombie") process, terminated but not reaped by its parent.

       For BSD formats and when the stat keyword is used, additional characters may be displayed:
       (...)
       L    has pages locked into memory (for real-time and custom IO)
       (...)
       +    is in the foreground process group

答え1

おそらく良いことをするには遅すぎるでしょう。しかし、プロセス569になることができるかどうか疑問に思います。いいえ完全ゾンビですね。おそらく、最初のスレッドは終了していますが、他のスレッドがまだ実行されている場合は、そのOS(どのOSですか?)で得られる可能性があります。その場合は、kill(1)まだ有効でなければなりません。そうでなければ、次に試すことはtgkill(2)またはオペレーティングシステムと同等のエントリをR状態にリストされているスレッドで実行します(これらのシステムコールを呼び出すためのプリインストールされたシェルユーティリティがない可能性があるため、いくつかのCを作成する必要があります)。

また、プロセスに接続または接続しようとすると、診断に役立ついくつかの情報が表示されることがありますstracegdb

ゾンビを収穫するときにバグがある可能性はほとんどありませんinit。バグならバグの可能性が高くなります。コアマルチスレッドプロセスでエラーが正しく処理されません(特定の状況では)。

答え2

初期化は常に待ちます。ことわざのように。したがって、カーネルにバグが発生する可能性は非常に少なくなります。プロセス569のppidとは何ですか?ps -alefこれを提供します。または、BSDの視点がある場合、ps axo stat,pid.ppid,comm親プロセスが初期化されていない場合、569は普通のゾンビ。ゾンビは数が増えると危険になるため、隅に配置して次回の再起動時に処理するだけです。

関連情報