要检查应用程序是否正在运行或不使用Java?

我有一个Java应用程序,在后台启动另一个Java应用程序(第三方),所以在启动第三方后台应用程序之前,我想检查应用程序是否已经运行(不想等待终止该应用程序) 。
我正在使用下面的代码启动第三方Java应用程序:

String path = new java.io.File("do123-child.cmd").getCanonicalPath(); Runtime.getRuntime().exec(path); 

注意:文件“do123-child.cmd”调用一个“.bat”文件来运行该应用程序。

要检查给定的应用程序是否正在运行,我正在使用以下代码[ Ref link ]:

 boolean result = false; try { String line; Process p = Runtime.getRuntime().exec("tasklist.exe"); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); while ((line = input.readLine()) != null) { if(line.startsWith("myApp.exe")){ result = true; break; } } input.close(); } catch (Exception err) { err.printStackTrace(); } return result; 

我想知道是否有任何其他的方式来做到这一点,而不是迭代当前运行的所有进程? 喜欢 :

 Process p = Runtime.getRuntime().exec("tasklist /FI \"IMAGENAME eq myApp.exe\" /NH"); int exitVal = p.exitValue(); //if above code throw "java.lang.IllegalThreadStateException" means application is running. 

但上面的代码返回0为所有应用程序。

提前致谢。

您可以使用jps来检查正在运行的Java应用程序。 jps与JRE捆绑在一起。

 jps -l 19109 sun.tools.jps.Jps 15031 org.jboss.Main 14040 14716 

您可以使用Runtime.getRuntime().exec()从该程序中Runtime.getRuntime().exec()列表并读取输入流 ,然后在Java中搜索包名。

既然你想避免迭代所有的结果,你可以grep结果使用findstr返回你正在寻找的基本p.exitValue()结果:

 Process p = Runtime.getRuntime().exec("jps -l | findstr /R /C:\"com.myapp.MyApp\""); int exitVal = p.exitValue(); // Returns 0 if running, 1 if not 

当然findstr是Windows特有的,所以你需要在Mac上使用grep

 Process p = Runtime.getRuntime().exec("jps -l | grep \"com.myapp.MyApp\""); int exitVal = p.exitValue(); // Returns 0 if running, 1 if not 

jps工具使用内部API( MonitoredHost )来获取这些信息,所以你也可以在Java中完全做到这一点:

 String processName = "com.myapp.MyApp"; boolean running = false; HostIdentifier hostIdentifier = new HostIdentifier("local://localhost"); MonitoredHost monitoredHost; monitoredHost = MonitoredHost.getMonitoredHost(hostIdentifier); Set activeVms = monitoredHost.activeVms(); for (Object activeVmId : activeVms) { VmIdentifier vmIdentifier = new VmIdentifier("//" + String.valueOf(activeVmId) + "?mode=r"); MonitoredVm monitoredVm = monitoredHost.getMonitoredVm(vmIdentifier); if (monitoredVm != null) { String mainClass = MonitoredVmUtil.mainClass(monitoredVm, true); if (mainClass.toLowerCase().equals(processName.toLowerCase())) { running = true; break; } } } System.out.print(running);