2014-09-10 61 views
2

所以我有我的程序,但我不希望它能夠被關閉。我知道它不可能使它100%不可封閉,但這種方法似乎是最好的。如何使程序監視程序重新啓動它,如果它退出

我意識到你可以addShutdownHook,但如果從操作系統中使用任務管理器(Windows)或kill -9(Unix)殺死進程,這將不起作用。顯然,如果我有第二個進程在運行,而主進程被終止,它可以重新運行主進程,這使得它更可靠。

所以,我想知道如何在Java中創建一個watchdog process,它監視我的實際Java應用程序以檢測它是否已關閉,如果它已關閉,則重新執行該程序。

+2

@EJP什麼做?????????? :-) – Leo 2014-09-10 12:10:38

+2

@EJP這甚至意味着什麼? – 2014-09-10 12:11:10

+0

你想要什麼叫做看門狗。你想在java中做到這一點?您可以使用操作系統提供的其他表單來執行此操作。 – 2014-09-10 12:19:32

回答

1
  1. 您的應用程序可以定期更新文件。看門狗可以檢查該文件是否最近已經更新;如果沒有,監督人會認爲應用程序已退出,然後重新啓動。應用程序可以在單獨的daemon thread中進行更新,以確保無論應用程序負載如何都會發生更新。這可以使用標準的Java來完成,因此非常便於攜帶。

  2. 另一種選擇是應用程序在find its own process ID (PID)開始運行時將其寫入文件。看門狗程序讀取該文件以查找應用程序的PID。然後它可以定期檢查list of running processes以檢查應用程序是否仍在其中。這更復雜,並使用一些不可移植的代碼。但是,它可以更好地集成在Unix計算機上作爲守護程序啓動和停止應用程序的傳統方式,因爲這些守護程序通常會將它們的PID寫入文件。

  3. 您已指定看門狗程序必須使用Java。如果您在Unix上運行它,並且您願意將其編寫爲shell腳本,it can be written very easilly,並且避免使用PID文件和掃描進程列表的問題。

+0

Thankyou有許多有趣的想法,這使得它更清晰,至於我必須做:) – 2014-09-10 12:54:53

1

根據退出代碼邏輯創建包裝「保鏢」腳本/應用程序。根據需要使其成爲正面或負面。

下面的Bash示例假定應用程序在存在42狀態時應該重新啓動。

#!/bin/bash 

code=42 
while ((code == 42)); do 
    myapp 
    code=$? 
done 

相同的包裝可以在Java中使用ProcessBuilder

+0

OP已明確要求Java。 – Raedwald 2014-09-10 12:51:05

相關問題