簡體   English   中英

防止jar的多個實例運行

[英]Prevent multiple instance of jar running

我的中間層jar文件在linux服務器上運行。 我希望該jar文件在后台不間斷運行。

nohup java -jar RushMiddleLayer.jar &

但是,當我重新運行該命令時,創建並運行了jar的另一個新實例。

我已經通過谷歌搜索。 他們提出了一些選擇。 “綁定ServerSocket”。 但這對我不起作用。 按Enter或Ctrl + C后,進程終止。

我想從罐子中獲得兩個好處。 一個總是以失敗告終。 如果使用相同命令重新啟動jar,則使用另一個命令(nohup java -jar RushMiddleLayer.jar&)。 它應該替換現有的jar,而不是創建新的實例。

只是為了確保我了解您想要什么,您想要一個在后台運行的jar文件,並且只能一次啟動一次?

如果這是您想要的,有兩種方法可以實現:

  1. 使用端口作為信號量(如您建議的那樣)
  2. 使用文件作為信號量。

對於選項1

代碼應該像下面這樣簡單:

try {
    serverSocket = new ServerSocket(port);
} catch (IOException e) {
    System.out.println("Could not listen on port: " + port);
    // ...
}

如果無法在此端口上打開服務器套接字,則將引發IOException 但是,如果某些其他應用程序正在使用此端口,也會發生這種情況。 因此,請小心選擇哪個端口號。

對於選項2,您只需使用FileWriter並創建一個虛擬文件,並將此文件保持打開狀態,直到jar /程序完成(或關閉)。 當jar的第二個實例嘗試打開時,將引發異常,並且將無法啟動,因為它會嘗試打開要寫入的文件,從而產生IOException,因為只有一個進程可以擁有一個IOException。同時將句柄寫入文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM