2012-04-24 30 views
0

24/7を実行するJavaアプリケーションがほとんどありません。私はこのアプリケーションのいずれかがクラッシュするかどうかをチェックする別のJavaアプリケーションを作成したいと思います。いくつかのアプリケーションがクラッシュした場合、私はそれを再起動したいと思います。このための解決策はありますか?Java - 別のJavaアプリケーションが実行されているかどうかを確認してください。

+0

これは私のOSタスクのように聞こえる。どのシステム(-s)を使用していますか? – DerMike

答えて

0

私は考えることができますあなたがクラッシュが発生すると思われるブロックにその例外を追加し、この例外が発生したときに別のJavaアプリケーションのいくつかのメソッドを呼び出しているクラッシュによって呼び出される。

+0

...例えば 'main'のように。 – DerMike

1

私はいくつかの方法を参照してくださいが、それを行うには良い方法があるはず:

  1. あなたが実行中のアプリケーションを管理している場合は、それらのそれぞれが、マシン上の特定のポートに耳を傾け作るとに返信することができますそれに対するあらゆる要求。次に、そのポートにpingを実行して、アプリケーションが実行されているかどうかを確認できます。

  2. 自分でアプリを起動する場合は、自分のpidを保存して、そのpidのプロセスがまだ生きているかどうかを確認できます。

  3. 各アプリはファイルを作成して定期的に更新することができます。その後、あなたの監視アプリケーションは、ファイルが更新されたかどうかをチェックすることができます。そうでなければ、アプリは死んでいる。

+1

"ポートをPingする"機能は、クラッシュがポートを聴いている部分を取り除く場合にも機能します。他のすべてがクラッシュしている状況があるかもしれません(例:競争状態でぶら下がっている)、ポートリスナーだけが幸せにpingに応答して散歩する。 – Torben

0

wmicユーティリティを使用できます。 Process proc = Runtime.getRuntime().exec("wmic.exe");

次に、Javaアプリケーション(javaw.exe)アプリケーションに関連付けられているさまざまなパラメータを確認できます。

+1

これはLinux上で動作しますか? – Astaz3l

+0

@ Astaz3lあなたはsuperuser.comでそれを尋ねるべきです;-) – DerMike

0

http://quartz-scheduler.org/)クォーツスケジューラまたはjava.util.Timer APIを使用して、再起動することができます。プロセスを確認します。いつまでも私はプロセスを実行します。私はあなたが格納できるPIDまたはプロセスIDを得ることができると信じています。 定期的に起動し、シェルスクリプトを呼び出してプロセスが実行中であるかどうかを確認します。 Runtime.getRuntime()を使用して新しいプロセスを生成する場合

0

単純なソリューションを使用できる場合、アプリケーションはアプリケーションのコア機能から外部リソースを更新する必要があります。外部リソースがしばらく更新されていない場合は、アプリケーションのコアが停止していることがわかります。

リソースを更新するために別のスレッドを使用すると、コア機能がクラッシュしますが、スレッドは実行を継続して何も検出しません。

外部リソースにはファイルを使用できます。そこに現在のタイムスタンプを書いてください。タイムスタンプがしばらく更新されていない場合は、アプリがクラッシュしました。または、ハードウェアのクラッシュを検出するためにモニターが別のマシンにある場合は、ネットワークソケットに書き込みます(アプリケーションがクラッシュした場合、モニターはかなり役に立たない)。

モニタはJavaプロセスのプロセス識別子を知っているため、必要に応じてそのプロセスを強制終了して再起動する必要があります。シェルスクリプトからアプリケーションを起動すると、プロセス識別子をファイルに書き込むことができます。

この種のソフトウェアモニタを製造する10億ドルの産業が存在します。それは簡単な仕事ではありません。

関連する問題