如果已经在 J​​ava 中打开,如何关闭程序

Posted

技术标签:

【中文标题】如果已经在 J​​ava 中打开,如何关闭程序【英文标题】:How to close a program if is already open in Java 【发布时间】:2017-02-04 03:36:14 【问题描述】:

我正在写这个服务器,我想检查同一个程序是否已经在运行,如果正在运行则关闭程序。

假设我运行 ServerA

然后我运行 ServerB(这是同一台服务器)

我想关闭 ServerA,这样 ServerB 才能成功运行。

【问题讨论】:

查看this 是否回答了您的问题。 ServerB 需要管理员权限才能关闭ServerA 致电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();
    

【讨论】:

请记住,如果您采用这种方式,对于跨平台支持(过去的 Windows),您需要找到操作系统并调用操作系统适当的等效命令来“taskkill” 谢谢,我知道,但这只是为了开发目的,也许我会保持原样,因为这个程序将在 Windows VPS 上运行。【参考方案2】:

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

【讨论】:

是的,但是我不想关闭当前程序,我想关闭最先运行的程序,以便新的程序可以运行【参考方案3】:

使用系统通过pid杀死进程是一种的解决方案。

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

您还可以使用 OSGi 容器:最好地使用模块生命周期。

【讨论】:

以上是关于如果已经在 J​​ava 中打开,如何关闭程序的主要内容,如果未能解决你的问题,请参考以下文章

如何替换已经在 J​​ava 中打印在屏幕上的文本?

Xamarin Forms:如何在 Xamarin ios 应用程序中检查 GPS 是打开还是关闭?

c#如何实现关闭当前窗体并打开另一个已经创建的窗体。

java中文件打开和关闭的问题

如何在警报视图中隐藏关闭按钮和关闭操作以仅显示“打开应用程序”按钮

mac电脑摄像头关闭广角功能