2012-02-13 11 views
2

Javaアプリケーションを再起動するためのログファイルウォッチドッグC#サービスを開発しようとしています。C#サービスからJavaアプリケーションを終了する方法

このJavaアプリケーションは、特別な通信プログラムを実行し、収集されたデータをログファイルに書き込みます。現在、バッチファイルスクリプトで開始されています。

ログファイルが新しいデータで更新されているかどうかをC#サービスで監視するようにします。新しいデータが得られない場合は、Javaアプリケーションを再起動します。

私は、C#アプリケーションでバッチスクリプトを呼び出し、ファイルが変更されたときにチェックすることについてオンラインの資料を見つけましたが、C#アプリケーションを使用して現在実行中のJavaプログラムを終了する方法があるのだろうか? Javaプログラム名はjavaw.exeですが、このマシン上で実行されている他のJavaプログラムであり、一意ではありません。誰かがこれを達成するためのどのようなアイデアを持っていますか?

+1

PowerShell – McKay

答えて

4

jps -vは、Javaで使用されているプロセスを詳細に示すJavaコマンドです。 c#でこの呼び出しを行い、その情報を文字列に渡すと、これをソートして、どのプロセスを削除するかを正確に判断できます。

あなたがそうのような出力にとることができます。この後

 ProcessStartInfo psi = new ProcessStartInfo("jps", "-v"); 
     psi.RedirectStandardOutput = true; 
     psi.UseShellExecute = false; 
     Process p = new Process(); 
     p.StartInfo = psi; 
     p.Start(); 
     string[] output = p.StandardOutput.ReadToEnd().Split("\n".ToCharArray()); 

を、あなたは簡単にあなたが実行しているJavaプロセスのプロセスIDと名前を解析することができます。

+0

これは、マシンにJava SDKがインストールされていることを前提としています。 JREのみがインストールされ、SDKはインストールされていないマシンでアプリケーションを実行する場合、そのプロセスの呼び出しはファイルが失われるため機能しません。デプロイメントを計画している場合、アプリケーションに必要なSDKファイルを含めることができます。しかし、EULA for Javaを読んでからガイドラインの中でそうしていることを確認してください – Moiz

2

プログラムを正常にシャットダウンする、つまり、丁寧にプログラムの終了を要求する何らかの信号を送信することをお勧めします。あなたが純粋なJava環境であれば、このためにJMXを使うことをお勧めしますが、あなたのウォッチドッグはC#であるので、普通のTCPソケットを使ってシグナルを送ることができます。このようなシグナルを受信できるようにJavaプログラムを変更することができれば、この方法は有効です。

任意のプロセスkilltaskコマンドまたはC#APIのいずれかを使用して、PIDで識別されるプロセスを強制終了できます。 Windows上で実行中のJavaプロセスのPIDを見つけるのは簡単な作業ではありません。しかし、メインのクラス名と引数を持つすべてのjavaプロセスを出力するコマンドjpsを使用することができます。 C#プログラムで java -Dmyid=1234 MyClass arg1 arg2

ストア1234(MYID):

あなたは-Dオプションを使用してJavaプログラムに特別な識別子を渡すことができます。次に、Javaプログラムがまだ実行中であるかどうかをチェックするときは、jpsを実行し、その出力を解析し、パラメータ-Dmyid=1234でプロセスを取得し、PIDをjpsで取得してプロセスを終了させます。

+0

これで、プログラムを実行して一意のIDを与えるときに-DmyIdオプションを使用できますか?私が選択したIDが既に存在する場合、他の既存のIDについて心配する必要はありますか?私はlaunch4jのようなソリューションを使用してjavaw.exeの名前を変更しようと考えていましたが、プロセスIDを設定する方が簡単なら、私のJavaプログラムは十分な依存関係があるので[ini-4jと特別なサードパーティ通信プロトコル]。 – user1207381

関連する問題