0

シナリオは次のとおりです。終了しないはずのJavaデーモンがあります。ただし、予期しないエラーが発生した場合は、クラッシュしたJVMをスクリプトで再起動する必要があります。そこで、JVMを開始するループを持つバックグラウンドbashを開始するコマンドを作成しました(JVMが終了すると、再び再起動されます)。

/bin/bash -c "while true; do java ...; done" &

デーモンを停止できるようにするために、このbashバックグラウンドプロセスを強制終了することを考えました(プロセスIDをファイルに保存することによって)。これは、バックグラウンドbashがJVMを再起動しない限り機能しますが、現在実行中のプロセスを強制終了しません。したがって、bashは、強制終了コマンドをチェックする前に、現在のコマンドを終了しているように見えます。現在実行中のJVMも強制終了したいと思います。

2つのPID(1つはバックグラウンドbash用、もう1つは現在実行中のJVM用)を管理したくないので、設計上現在のコマンドを停止する「強制キル」の方法はありますか?(私は人殺しでそのようなものを見つけることができませんでした)?

4

3 に答える 3

3

まさにこの目的のために構築されたプロセス管理ツールが多数あります。rinit、daemontools、upstart... SysV inittab テーブルのエントリですらあります。

これらはすべて、シャットダウン直後の再起動を自動化し、現在のステータスとは対照的に目的のステータスを追跡し (そして、必要に応じて起動またはシャットダウンのシグナルを送信しようとします)、シグナル配信の管理などを行います。

bash でシグナルをトラップしてイベントをトリガーすることはできますが、それはトラップできるサブセットのみを処理します (たとえば、KILL をトラップすることはできません)。より良いのは、目的に合わせて構築されたツールを使用することです。


wooledge.org wikiのProcessManagement ページ(irc.freenode.org の #bash チャネルで使用) には、bash でこれを自分で行うための具体的な提案が他にもいくつかあります... ただし、runit、daemontools、およびそれらの同類が最高のものとして提案されていますが、アプローチを実践します。

于 2012-06-18T17:25:48.923 に答える
0

cronを使用してアプリを起動し、アプリに属する​​ pid を 1 つだけ管理してみませんか? そうすれば、常に正しいプロセスを強制終了できます。

少し強調すると、アプリを管理するための bash スクリプトを作成できます: start|stop|status. 開始時に、Java pid をファイルに保存します。次に、cron ジョブをスケジュールしてアプリのステータスを確認し、pid が存在しない場合は再起動します。

于 2012-06-18T17:14:25.087 に答える
0

これは bash のデフォルトの動作ではありませんか? たとえば、zshは反対のことを行い、すべての子プロセスにSIGHUPを送信しないと思いましたか? たぶん、この答えを試して、小さなスクリプトを書いて、disown で始めることができますか?

この質問を参照してください:プロセスの寿命をそれを開始したシェルに結び付けます

私はそれをテストしませんでしたが、手動で起動して CTRL-D を 2 回押してシェルを終了するため、Web サーバーに zsh が必要です。

于 2012-06-18T19:05:21.857 に答える