アプリケーションが実行されているかどうかを確認するJavaアプリケーションがあります。それが実行されていない場合は、私はそれを開始したい。実行している場合、私はそれを殺すし、それを再起動したい。プロセスの検出/制御
これを行う方法を教えてもらえますか? ProcessBuilderを使って、プログラムを簡単に開始/停止することができます。しかし、すでに実行中のプロセスは検出できません。
ありがとうございました! John
アプリケーションが実行されているかどうかを確認するJavaアプリケーションがあります。それが実行されていない場合は、私はそれを開始したい。実行している場合、私はそれを殺すし、それを再起動したい。プロセスの検出/制御
これを行う方法を教えてもらえますか? ProcessBuilderを使って、プログラムを簡単に開始/停止することができます。しかし、すでに実行中のプロセスは検出できません。
ありがとうございました! John
愚かに聞こえるかもしれませんが、アプリケーションの起動時に既知の名前のファイルを作成できます。何も含める必要はありません。アプリケーションが実行されているかどうかを確認するには、そのファイルが存在するかどうかを確認します。
良い考えではありません - アプリケーションやシステムがクラッシュすると、アプリケーションを実行していなくても、ファイルが無期限に横たわってしまいます。 –
あなたはそれについて絶対に正しいです。 – raupach
これは、プロセスのpidをそのファイルに書き込むためです。そのため、そのファイルを読み取っているときにプロセスが実際に実行されているかどうかを確認できます。そのPIDを持つプロセスがない場合は、ファイルをクリーンアップします。別の名前または何かがある場合は、そのファイルをクリーンアップします。そうでなければ、実行を拒否してください。それは絶対確実ではありませんが、これは非常に一般的な解決策です。 – wds
(ネットワークポートでリッスンするのが理想です)、不可能(Javaアプリケーションにはアプリケーションを強制終了する権限がない可能性があります)で、OS固有のコードが必要です。 Linuxでは、ps
コマンドとkill
コマンドを使用します。
Java用の他のIPCメカニズムはありませんか? –
標準APIにはありません。 –
他のアプリケーション(監視しているプロセス)はあなたの責任ですか?もしそうなら、私はいくつかの高可用性システムで数年前に使った方法を使うことができます: その他のアプリケーションとの接続を開き、それに "ping"してください。他のアプリケーションが所定のタイムアウト時間内に応答しない場合は、ダウンしているか「ハング」しています(これはプロセス監視で検出できないものです) ソケットを使用して接続を開くことができます。複雑なプロトコル(SOAP?) 別の方法として、アプリケーションは「私は生きている」というメッセージを頻繁に送信することです。アプリケーションを再起動する必要がある場合は、しばらく受信していない場合 実際には、他のプロセスを強制終了する場合は、exec()メソッドから取得したProcessインスタンスをそのまま残しておき、それをdestroy()することができます。
私は恐れていました。私は起動したいアプリケーションにもっと多くのものを追加しないようにしようとしています。アプリケーションのコレクション。
私が書いているWebサーバーアプリケーションは、基本的には、目標を達成するためにお互いに話す3つのアプリケーションを開始/停止します。私のWebサーバーが起動し停止すると、すべて正常です。しかし、何らかの理由で彼らが彼らを始めようとしているときにすでに走っているとすれば、悪いことが起こります。
Visual Studio(C++/C#/ etc)で処理できることがわかっています。しかし、このプロジェクトは、プラットフォームの独立性の要件のためにJavaで書かれなければなりません。
ご協力いただきありがとうございます。
どのプラットフォーム/ OSですか? "ターゲット"プログラムは開発コントロールの下にありますか?それを変更できますか? – basszero