2012-04-24 118 views
0

我有幾個24/7全天候運行的java應用程序。我想編寫另一個Java應用程序,它檢查是否有任何應用程序崩潰。如果某個應用程序崩潰了,我想重新啓動它。有沒有解決方案?Java - 檢查是否有另一個Java應用程序正在運行

+0

這聽起來像是我的一項操作系統任務。你使用哪個系統(-s)? – DerMike 2012-04-24 07:08:21

回答

0

什麼我能想到的是,當這個例外是,您可以定義在這些24/7運行的程序一個新的自定義異常,添加例外,在那裏你可以認爲發生碰撞塊,然後調用另一個Java應用程序的一些方法由碰撞調用。

+0

...就像'main'一樣。 – DerMike 2012-04-24 07:05:39

1

我看到一些方法,但應該有更好的方式來做到這一點:

  1. 如果你有在你運行的應用程序的控制,你可以讓他們每個人聽一個給定端口的機器上並回復對它的任何請求。然後,您可以簡單地ping該端口以查看應用程序是否正在運行。

  2. 如果您自行啓動應用程序,你可以存儲他們的PID,然後檢查是否與該PID的進程仍然活着。

  3. 每個應用程序都可以創建一個文件並定期更新它。然後,您的監控應用程序可以檢查文件是否已更新。如果沒有,那麼應用程序已經死了。

+1

「Pinging a port」工作如果崩潰還會降低偵聽端口的部分。您可能會遇到其他所有事件都已崩潰的情況(例如,掛在競賽狀態),只有港口聽衆高興地迴應乒乓。 – Torben 2012-04-24 10:21:10

0

您可以使用wmic實用程序。 像這樣:Process proc = Runtime.getRuntime().exec("wmic.exe");

然後,您可以檢查與您的java應用程序(javaw.exe)應用程序相關的不同參數。

+1

這將工作在Linux上? – Astaz3l 2012-04-24 07:05:07

+0

@ Astaz3l你應該問一下superuser.com ;-) – DerMike 2012-04-24 07:07:21

0

您或許可以使用(http://quartz-scheduler.org/)Quartz調度,或java.util.Timer中的API來喚醒的過程recurrently.and檢查。有時候你運行這個過程,我相信你可以得到可以存儲的PID或進程ID。 定期喚醒並調用shell sript來檢查進程是否正在運行。如果沒有,那麼產卵使用調用Runtime.getRuntime()新工藝

0

如果你可以用一個簡單的解決方案,應用程序必須從應用程序的核心功能更新內外部資源。如果外部資源暫時未更新,則知道應用程序的核心已停止。

如果您使用單獨的線程來更新資源,您的核心功能將崩潰,但線程繼續運行並且您什麼也沒有檢測到。

外部資源可以是文件。在那裏寫下當前的時間戳。如果時間戳沒有更新一段時間,那麼應用程序崩潰。或者,如果您的顯示器位於單獨的計算機上以檢測硬件崩潰(如果顯示器與您的應用程序崩潰,則顯示器將毫無用處),則可以寫入網絡套接字。

您的監視器必須知道Java進程的進程標識符,以便它可以殺死它並在需要時重新啓動它。如果從shell腳本啓動應用程序,則可以將進程標識符寫入文件中。

有一個十億美元的產業生產這種軟件監視器。這不是一項微不足道的任務。

相關問題