Javaプログラム(Linux上)で外部プロセスを開始していますが、送信しているSIGKILLではなくSIGTERMシグナルを送信する機能が必要exec.getWatchdog().destroyProcess()
です。commons-execで開始されたUNIXプロセスをより適切に停止できる方法はありますか?または、適切なkillコマンドを自分で実行できるようにPIDを取得できますか?
3 に答える
ExecuteWatchdogクラスには、プロセスを強制終了するためのメソッドがあります。
したがって、タイムアウトの長いウォッチドッグを作成し、それを使用して必要なときにプロセスを強制終了することができます。
executor.getWatchdog().destroyProcess();
Commons Execは、PIDを公開しないJavaProcessクラスに依存しています。これはプロセスを強制終了するために使用されるものでもあるため、動作を変更できるものではありません。すべてが素晴らしく、カプセル化されています。お奨めはOOが大好きですよね?
プロセスをバックグラウンドで起動するだけの場合は、PIDをキャプチャする単純なシェルスクリプトでプロセスをラップし、Javaルーチンが認識している「既知の場所」に保存することができます。それでもやや面倒で、当然、他のプラットフォームへの移植はうまくいきません。
JNIを使用して独自のexec関数を記述し、この情報を取得することもできますが、それはあまり友好的ではありません。
プラットフォーム固有のexecランチャーデーモンを、よりシステム指向の何か(C、Pythonなど)で作成できます。ITメッセージを送信して起動と停止を行い、そのプロセスを処理します。これの利点の1つは、新しいプロセスを実行するときにJVMをフォークする必要がないことです(JVMのサイズによっては非常に高額になる可能性があります)。
デーモンを最初に起動して、ソケットまたはパイプを共有できます(どちらもかなり移植性があります)。これは実際にはひどくエレガントでないソリューションではなく、多くのシステム固有の動作を区分化します(たとえば、WindowsとUnixで完全に異なるプロセスを使用でき、Javaは同じままで、小さなデーモンを移植する必要があります)、 JNIを実行する必要はありません。
さて、あなたはそれをgrepすることができます、例えば:
for i in $(ps -ef | grep -i "[Y]ourClassName" | awk '{print $2}'); do kill -9 $i; done
これは、複数回実行している場合です(ただし、プロジェクトが1つしかない場合は機能します)。grepの[]に注意してください。つまり、grepは独自のプロセスpidを提供せず、-iは無視する場合、awkはPID番号である2番目の列のみを印刷するためのものです。