Mac OSXで実行されているJavaサーバーアプリケーションがあります。
このアプリケーションが応答しなくなることがあり、kill -9
で強制終了することにしました。ただし、プロセスは消えません。それはまだps
に表示され、名前を括弧で囲み、STAT列に疑問符を付けます。
$ ps u -p 776
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
camadmin 776 0.0 0.0 0 0 ?? ?E 5:12PM 0:00.00 (Java)
さらに、サーバーによって使用されているポートはまだバインドされています。
$ netstat -na | grep 9902
tcp4 0 0 *.9902 *.* LISTEN
lsof
には表示されませんが:
$ Sudo lsof -P -i tcp | grep 9902
$
ポートがバインドされたままの場合、サーバーアプリケーションを再起動できません。マシンを再起動する以外に、ポートを解放してこのプロセスを本当に強制終了させるために何ができるでしょうか。
プロセスは、終了する前に何かを待機しています。
多分システムコール。マウント解除されたファイルにアクセスしようとすることは、この一般的な例、または利用できないネットワーク共有です。
殺す必要のある親または子プロセスはありますか?
私はMacOSユーザーではありませんが、Linuxではps wwauxf | less
は、プロセス階層を参照して親プロセスと子プロセスを探すのに役立ちます。 strace -p [pid]
は、まだ戻っていない現在のシステムコールについて何か役立つことを教えてくれるかもしれません。
-
編集:あなたのプロセスはlaunchdによって開始されていますか?数人の人がそれに問題を抱えているようです(例 OS Xで「既存の」プロセスを強制終了する方法(状態= E) )そして上記のように、おそらく親プロセスを強制終了する必要があります。このケースが開始されます。それは再起動よりも良くないかもしれません。
おそらく、launchdは、アプリが停止した場合に再起動するためにアプリへの接続を維持しますが、ここではそれほど役に立ちません。
キル-15はもっとうまく機能しますか?つまり、あなたが説明する状態に入る前に、それから抜け出す方法としてではありません。
状態E
は、プロセスが終了していることを意味しているようです。しかし、あなたのプロセスは基本的に決して存在しないゾンビです。私が見つけたオンラインのすべては、再起動以外にできることはほとんどないことを示しています。 OS X(状態= E)で「既存の」プロセスを強制終了する方法 。他のサービスが影響を受けたためにOSXサーバーを再起動したくない場合は、(回避策として)次のいずれかを検討してください。
このJavaサービスを別のOSXマシンに移行し、最小限の影響で必要なときにいつでも再起動できるようにします
このサーバーに十分なRAMがある場合は、VMを作成し、VM内からこのサービスを実行できます。プロセスが応答しなくなり、応答しない場合強制終了された場合は、VMをバウンスするだけで、ホストOSに影響を与えることはできません。Javaのように見えるため、必ずしもゲストをVM)にする必要はありません。 =OSX。UbuntuまたはCentOSVMで試してみてください。どちらかをアプライアンス(OVA/VDIファイル)としてダウンロードし、30分以内にVirtualBoxで稼働させることができます。ゾンビの問題が発生しない可能性もあります。 LinuxVM。 http://virtualboximages.com/Free.VirtualBox.VDI.Downloads を参照してください。