【问题标题】:Java kill program if already runningJava kill 程序(如果已经运行)
【发布时间】:2015-01-19 16:33:18
【问题描述】:

我希望我的 java 程序检查它的另一个实例是否已经在运行,如果是这种情况,则将其终止(在 Windows 平台上)。我正在用代码做这个

String CMD = 
        "wmic PROCESS where \"CommandLine like '%%MyProgram%%'\" Call Terminate";
Process process = Runtime.getRuntime().exec(CMD);

代码成功执行,如果找到则终止正在运行的程序,但是一旦执行,它也会强制调用程序退出(必须有一些对 System.exit() 的隐藏调用)。有没有办法在不退出调用程序的情况下执行命令?

【问题讨论】:

  • 我相信这个命令也会捕获当前实例,因此它会终止所有其他实例,以及这个实例。
  • 终止当前正在运行的进程而不是根本不启动新进程不是一个坏方法吗?稍微想想……
  • 是的,它必须捕获当前实例,我不知道为什么我没有想到它。但问题依然存在:只有在没有其他实例在运行的情况下,如何执行程序?
  • 只需检查是否有像您这样的其他进程并使用System.exit(0) 之类的内容终止您自己的实例。

标签: java cmd


【解决方案1】:

如 cmets 中所述,该命令还将终止新实例。有一些方法可以解决它,例如 creating pid files 以确保只有一个实例在运行。但这可能并不重要,因为有更好的方法可以做到这一点。

请检查How to implement a single instance Java applicationHow to allow running only one instance of a java program

【讨论】:

    【解决方案2】:

    您可以为此利用 Windows 服务。您将知道只有一个实例会运行 + 您可以在没有用户登录的情况下运行它(如果需要)。将 Apache Commons Daemon 与 procrun 一起使用(如果仅适用于 Windows):

    http://commons.apache.org/proper/commons-daemon/index.html http://commons.apache.org/proper/commons-daemon/procrun.html

    更多选项和探索守护进程和 Java 的 SO 参考: How to Daemonize a Java Program?

    祝你好运!

    【讨论】:

      【解决方案3】:
      try {
          ServerSocket ss = new ServerSocket(1044);
      } catch (IOException e) {
          System.err.println("Application already running!");
          System.exit(-1);
      }
      

      多平台,6 行。唯一的问题是端口 1044(您可以更改它)必须打开。基本上,运行程序会建立一个“服务器”,但是如果端口已经是一个服务器,它已经启动了,它会关闭。

      请记住,在与另一台服务器相同的端口上启动服务器是不可能的,我们可以利用这一点。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-06
        • 1970-01-01
        • 1970-01-01
        • 2013-06-08
        相关资源
        最近更新 更多