如何关闭程序,如果已在Java中打开

问题描述:

即时通讯编写此服务器,并且我想检查是否相同的程序已在运行,如果正在运行关闭程序。如何关闭程序,如果已在Java中打开

说我运行服务器A

然后我运行服务器B(至极是在同一台服务器)

我想关闭服务器A,以便服务器B可以成功地运行。

+0

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

+0

'ServerB'需要管理员权限才能关闭'ServerA'。 –

+0

调用'pkill'可能是一个简单的解决方案。虽然在包装你的程序的shell脚本中执行它可能更容易,而不是用Java构建它。 –

好吧,我能做到像这样......使用

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上。 –

如果你想关闭的程序,如果它是开放的
你可以去:
System.exit(0);
还有很多其他退出代码,但0似乎符合您的要求。

+0

是的,但我不想关闭当前的程序,我想关闭运行的程序,以便新程序可以运行 –

使用系统杀pid的过程是一个解决方案。

可以使用RMI(远程方法调用)创建单个实例应用程序,或者在您的情况下发送kill函数,以便应用程序可以自行终止。 (正常终止,需要应用来仍在运行。)

你也可以使用一个OSGi的容器:与模块生命周期的最佳发挥。