2012-02-13 90 views
2

我正在嘗試開發日誌文件監視程序C#服務以重新啓動Java應用程序。如何從C#服務中終止Java應用程序

這個Java應用程序運行一個特殊的通信程序和寫入的數據收集到一個日誌文件。它目前正在使用批處理文件腳本啓動。

我希望我的C#的服務來監視日誌文件是否被用新的數據更新。如果它沒有獲取新數據,我想重新啓動Java應用程序。

我發現網上的材料有關C#應用程序調用批處理腳本,當文件被修改檢查,但我想知道如果他們的是一種使用C#應用程序終止當前運行的Java程序? Java程序名稱是javaw.exe,但它們是在本機上運行的其他Java程序,因此它不是唯一的。有沒有人有任何想法如何做到這一點?

+1

你可能想要的是PowerShell – McKay 2012-02-13 17:59:19

回答

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文件。但是請確保在閱讀Java的EULA之前確保您的指南符合要求 – Moiz 2012-05-03 18:03:26

2

這是一個很好的做法,關閉的程序正常,即發送某種信號是禮貌地詢問程序終止。如果你在純java環境中,我建議你使用JMX來做這件事,但是因爲你的看門狗在C#中,你可以使用普通的TCP套接字發送信號。如果您可以修改Java程序以便能夠接收此類信號,則此方法很好。

kill任何進程都可以使用killtask命令或C#API來殺死由PID標識的進程。在Windows上查找運行java進程的PID並不是一項簡單的任務。但是你可以使用命令jps來打印所有的java進程及其主類名和參數。

你可以通過特殊標識來使用-D選項Java程序:在C#程序 java -Dmyid=1234 MyClass arg1 arg2

商店1234(身份識別碼)。然後,當你想檢查java程序是否仍在運行執行jps,解析它的輸出,獲得與參數-Dmyid=1234的過程中,得到了PID通過jps返回和終止進程。

+0

所以我可以使用-DmyId選項,當我運行我的程序給它一個獨特的ID?如果我選擇的身份證已經存在,我是否需要擔心其他現有身份證?我正在考慮嘗試使用像launch4j這樣的解決方案重新命名javaw.exe,但是如果設置進程ID更容易,我更喜歡它,因爲我的Java程序具有足夠的依賴性以使其工作[ini-4j和特殊的第三方通信協議]。 – user1207381 2012-02-15 16:44:50