web-dev-qa-db-ja.com

OS X10.7でのJavaゾンビプロセスの強制刈り取り

MacBook ProでCrashPlanを実行していますが、少し問題が発生しました。本質的に、それはフォーク爆弾を引き起こしました。幸い、ターミナルウィンドウが開いていて、次のコマンドを実行できました。

Sudo launchctl unload /Library/LaunchDaemons/com.crashplan.engine.plist

そのため、絶え間ない再産卵は停止しました。しかし、まだ900を超えるJavaプロセスがあり、最大プロセス数に押し上げる以外は何もしていません。開いているコードがたくさんあるので、コンピューターを再起動したくないです。ファイル、Webページなど。システムにこれらのゾンビを刈り取らせる簡単な方法はありますか?親プロセスを強制終了しますが、それらはすべてPID 1として知られる起動によって開始されます。その時点で、再起動することをお勧めします。 。

私が試してみました:

Sudo kill -9 <PID>
Sudo kill -9 Java
Sudo killall -9 Java    

それを行うためにlaunchdを殺さずにゾンビを一度だけ殺す方法はありますか?それとも、このゾンビの黙示録を生き残るために再起動する必要がありますか?

5
Mechcozmo

ゾンビはすでに死んでいます。プロセスについて考えるのではなく、プロセススロットのみについて考えてください。殺すものは何もないので、kill-9はkill-1と同様に機能し、何も意味しません。

彼らは親が彼らを刈り取るのを待っています。親が何らかの理由で生成せず、親がカーネルにそれらを生成しないように指示しない場合、それらはゾンビとして残されます。

従来のUNIXでは、pid 1はinitであり、常に子を取得します。 launchdも同じようにコーディングされていると思います。 PPIDが1のゾンビがいる場合は、再起動する以外は、その時点ではほとんど選択肢がありません。

4
Rich Homolka

残念ながら、これを行う方法はありません。ゾンビプロセスは、親が最終的にそれらを刈り取り、リソースを消費しないため、通常は無害です...しかし、それらはシステムが許可する最大プロセス数に貢献します(これはRAMがコンピューターにインストールされていますが、Lionでこれに関するドキュメントが見つかりません)。JVMインスタンスはlaunchd(MacではPID 1)によって所有されており、launchdを強制終了して再起動せずに再起動する安全な方法はありません。また、launchdのすべての子を殺します。これはカーネルを除いたすべてになります。

これは、暴走したLaunchAgentに適用される可能性があります。プロセスはすべてlaunchdの子であり、それは私がプレイしていたのと同じ問題をもたらします。 Javaコードのすべてのビットによって起動されたすべてのJVMインスタンスがlaunchdによって生成されるとは思いませんが、CrashPlanがJavaなどを使用するようになりました。私はそれらを私のシステムに散らかしていた。

ここで学ぶべき教訓は、爆弾をフォークしないで、ターミナルウィンドウを手元に置いておくことだと思います。再起動するとゾンビが一掃されたので、すべて問題ありません。

2
Mechcozmo