我想要做的是一个程序,知道它是否在Windows
上处于活动状态,以便在Java
使用它。 我看了一下互联网,发现了两个不同的解决scheme:
但这并不是我所期望的。
根据选项1,我想要一个方法来引用该进程(并检测它是否处于活动状态/正在运行),但不search完整的tasklist
,然后在其上search。 我正在search是否有一个直接的方法来做到这一点。
我也尽pipe添加一个filter的任务列表,但无法find任何filter,只得到我正在寻找的过程。 我看到所有的选项使用tasklist /?
在我的命令行。
然后我search了关于第二个选项和wmic
(我以前从未听过)的信息,看起来wmic
允许你在命令行上执行任务(如果我错了,请纠正我)。
所以,在这里我有两个问题 :
有没有一个直接的方法来知道一个进程是否在Windows上与Java激活? 试图避免在完整的任务列表中search或使用wmic
。
如果不可能,如果我们谈论高效的编程,上面提到的两个选项中的哪一个会更好?
提前致谢!
没有直接的方法来查询一般的进程,因为每个操作系统的处理方式不同。
你有点卡在使用代理,如直接操作系统命令…
但是,您可以使用带有/ fi参数的tasklist.exe来查找特定进程。
例如: tasklist.exe /nh /fi "Imagename eq chrome.exe"
注意强制性的双引号。
MS Technet站点上提供了语法和用法。
同样的例子,在Java中过滤“chrome.exe”:
String findProcess = "chrome.exe"; String filenameFilter = "/nh /fi \"Imagename eq "+findProcess+"\""; String tasksCmd = System.getenv("windir") +"/system32/tasklist.exe "+filenameFilter; Process p = Runtime.getRuntime().exec(tasksCmd); BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); ArrayList<String> procs = new ArrayList<String>(); String line = null; while ((line = input.readLine()) != null) procs.add(line); input.close(); Boolean processFound = procs.stream().filter(row -> row.indexOf(findProcess) > -1).count() > 0; // Head-up! If no processes were found - we still get: // "INFO: No tasks are running which match the specified criteria."
最好的方法是从java实例启动进程。 这种方法的优点是你可以完全确定正在运行的进程是你开始的进程。 使用任务列表,普通用户可以用名称作为目标来启动一个进程,或者在程序关闭时重新使用该进程。
有关如何启动进程的信息,请参阅此问题。
Process myProcess = Runtime.getRuntime().exec(command);
然后,您可以使用Process的方法来监视程序的状态,例如myProcess.exitValue()
阻塞,直到程序关闭。
有了Java 9,你可以这样做:
Optional<ProcessHandle> processHandle = ProcessHandle.of(pid); boolean isrunning = processHandle.isPresent() && processHandle.get().isAlive();
你现在也可以直接用java获得有关进程的一些信息。
Optional<ProcessHandle> processHandle = ProcessHandle.of(pid); if(processHandle.isPresent()) { ProcessHandle.Info processInfo = processHandle.get().info(); System.out.println("COMMAND: " + processInfo.command().orElse("")); System.out.println("CLI: " + processInfo.commandLine().orElse("")); System.out.println("USER: " + processInfo.user().orElse("")); System.out.println("START TIME: " + processInfo.startInstant().orElse(null)); System.out.println("TOTAL CPU: " + processInfo.totalCpuDuration().orElse(null)); }