2017-02-04 93 views
3

即時通訊編寫此服務器,並且我想檢查是否相同的程序已在運行,如果正在運行關閉程序。如何關閉程序,如果已在Java中打開

說我運行服務器A

然後我運行服務器B(至極是在同一臺服務器)

我想關閉服務器A,以便服務器B可以成功地運行。

+0

查看是否[this](http://stackoverflow.com/questions/660205/start-java-program-only-if-not-already-running)回答您的查詢。 – VHS

+0

'ServerB'需要管理員權限才能關閉'ServerA'。 –

+0

調用'pkill'可能是一個簡單的解決方案。雖然在包裝你的程序的shell腳本中執行它可能更容易,而不是用Java構建它。 –

回答

1

好吧,我能做到像這樣......使用

public static void main(String[] args){ 
    String PIDtoKill = readPIDFile(); 
    if(!PIDtoKill.isEmpty()) 
     killPID(PIDtoKill); 
    saveThisPIDtoFile(); 
} 

方法....

private static String readPIDFile() { 
    try { 
     for (String line : Files.readAllLines(Paths.get("C:\\Users\\MyUser\\Desktop\\PIDsRunning.txt"))) 
      return line; 
    } 
    catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
    return ""; 
} 

private static void saveThisPIDtoFile() { 
    String pid = ManagementFactory.getRuntimeMXBean().getName(); 
    pid = pid.substring(0, pid.indexOf("@")); 

    List<String> lines = Arrays.asList(pid); 
    Path file = Paths.get("C:\\Users\\MyUser\\Desktop\\PIDsRunning.txt"); 

    try { 
     Files.write(file, lines, Charset.forName("UTF-8")); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

private static void killPID(String pIDtoKill) { 
    try { 
     Runtime.getRuntime().exec("taskkill /F /PID " + pIDtoKill); 
    } 
    catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 
+0

請記住,如果你採取這種途徑,跨平臺的支持(過去的Windows),你需要找到操作系統,並調用操作系統相應的命令'taskkill' –

+0

謝謝,我知道但這只是爲了devoloping的目的,也許我離開它,因爲這個程序將運行在Windows VPS上。 –

0

如果你想關閉的程序,如果它是開放的
你可以去:
System.exit(0);
還有很多其他退出代碼,但0似乎符合您的要求。

+0

是的,但我不想關閉當前的程序,我想關閉運行的程序,以便新程序可以運行 –

0

使用系統殺pid的過程是一個解決方案。

可以使用RMI(遠程方法調用)創建單個實例應用程序,或者在您的情況下發送kill函數,以便應用程序可以自行終止。 (正常終止,需要應用來仍在運行。)

你也可以使用一個OSGi的容器:與模塊生命週期的最佳發揮。

相關問題