2012-04-16 35 views
0

我的朋友在接受採訪時曾提出以下問題(S):同時讓應用程序只有一個實例

  1. 您將如何確保有一個應用程序只有一個實例(如tomcat)一次運行?

  2. 當一個應用程序的另一個實例啓動時,應當顯示一個錯誤消息說一個實例已在運行

  3. 當應用程序異常終止,我們應該可以啓動應用程序。

我對上述問題的回答涉及到端口。有沒有人對上述問題有更深入的瞭解?

+0

請參閱http://stackoverflow.com/questions/2528844/only-one-swing-frame-window-opened-at-time/2528860#2528860 – 2012-04-16 09:11:29

+0

我也會使用一個端口。簡單的答案往往是最好的,所以也許沒有更深的理解。我能想到的唯一技巧是在綁定到端口之前使用'socket.setReusableAddress(true)'**。你有什麼疑問? – 2012-04-16 09:11:32

回答

0

夫婦的可能性,以檢查應用程序已經運行的情況下,我敢肯定有很多更多:

  1. 檢查具有相同名稱的其他進程已在運行(問題,如果有一個應用程序一旦你發現它的名稱相同,但不太可能)
  2. 使用文件作爲鎖(但如果你崩潰可能導致問題)

顯示,如果一個實例已在運行的消息是微不足道正在運行(只顯示我並退出)

編輯:@rtang使用PID文件仍然可以導致問題,如果另一個進程在應用程序崩潰後收到相同的PID。在這種情況下,除非手動刪除文件,否則您的應用程序將無法啓動。

+0

你說得對。您可以通過以下方法縮小問題的範圍:使用該PID解析程序的名稱或使用某種信號處理程序(例如EXIT上的「陷阱」)來刪除PID文件等。 – 2012-04-16 12:49:22

12

我建議你使用「PID文件」。

例如,您可以在啓動應用程序時創建PID文件(例如在/var/run/mypgm.pid下)。在該pid文件中存儲應用程序的PID(進程ID)。當你關閉你的應用程序時(清理)你刪除該PID文件。

現在,當您第二次啓動應用程序時,請檢查該PID文件是否存在。如果該文件存在,你有兩個選擇:

  • 你的應用程序仍在運行
  • 你的應用程序崩潰和pid文件依然存在。

現在你可以解析該PID文件來檢查是否仍然有一個進程運行該PID。如果是這樣,則顯示錯誤消息。如果沒有,您只需刪除PID文件並啓動您的應用程序。

相關問題