2

私はいくつかのことを行ういくつかのシェルスクリプトを書いています:

  1. main.shを画面の下で実行し、いくつかの変数を設定してから呼び出します:フォアグラウンドstart.sh (& なし)

  2. start.shが実行され、いくつかの Java 固有の変数が設定され、 Javaプロセスが起動されます (再びフォアグラウンドで) 。

  3. Javaが実行され、'quit' コマンドを受信するまで処理が行われます。(これも最前列で

    したがって、私のプロセスツリーは次のようになります。

  -main.sh
    \- start.sh
      \- ジャバ

問題は、Java プログラムが時折、「終了」コマンドを尊重しない奇妙な状態になり、楽しそうにそこに座って自分の仕事をしているということです。この Java プロセスのプロセス ID を PID ファイルに保存し、-STOP(17?) -TERM(15) および KILL(9) シグナルをこれらの Java プロセスに送信しましたが、それらを適切に強制終了するものはないようです。

「start.sh」プロセスを kill -9 できます。これにより、プロセス ツリーが強制終了されますが、Java プロセスは恐ろしい機能停止 (ゾンビ) 状態のままになり、サーバーを再起動することが唯一の解決策になります。

これらの状況に陥らないようにする方法について誰かが意見を持っているかどうか、またはこれらのゾンビプロセスの発生を防ぐ可能性のある、不足しているLinux /シェル機能があるかどうか疑問に思っていました. また、Java アプリケーション コードはプロプライエタリ アプリケーションであるため変更できません。ソース コードも入手できません。

これは、2.6.35.13-92.fc14.x86_64 カーネルを搭載した Fedora 14 で実行されています。

前もって感謝します、

4

2 に答える 2

4

ゾンビは死んでいます。それらを所定の位置に置いておきたい場合は、親(main.sh / start.sh)がwait/ waitpiditする必要があります。

于 2011-07-07T06:25:40.873 に答える
3

ウィザードが杖を振ると、周りの人が彫像のように凍りつき、再び振ると、以前と同じように続く映画を見たことがありますか?それは望んkill -STOPでおり、それから自分自身を守るためにプロセスができることは何もありません。

ゾンビは終了したプロセスであり、親プロセスに終了したことを通知するのを待っているだけなので、Javaプロセスがゾンビになることに驚いています。しかし、親はチェックしている必要があります。ほとんどのシェルは定期的にチェックします。

親プロセスをすでに強制終了している場合、子プロセスは「親を変更」し、init(PID 1)の子プロセスになります。通常、initは、プロセスが終了したことを通知するプロセスに常に注意を払います。

親シェルの場合kill -STOP、子プロセスが終了したことを通知する子プロセスに応答できないため、。で親を再起動するまで、子はゾンビになりますkill -CONT

于 2011-11-26T10:42:12.793 に答える