繁体   English   中英

如何检查进程是否在Windows上运行?

[英]How to check if a process is running on Windows?

我想要做的是一个程序,以了解它是否在Windows上处于活动状态以便在Java使用它。 我在互联网上看了两个不同的解决方案:

但它根本不是我要找的东西。

根据选项1,我想要一个方法来引用该过程(并检测它是否处于活动/运行状态),但不在完整的tasklist搜索然后搜索它。 我正在寻找是否有直接的方法来做到这一点。

我还想在任务列表中添加一个过滤器但是找不到任何过滤器来获取我正在寻找的过程。 我看到使用tasklist /?所有选项tasklist /? 在我的命令行上。

然后我搜索了关于第二个选项和wmic (我以前从未听过)的信息,似乎wmic允许你在命令行上执行任务(如果我错了请纠正我)。

所以,我有两个问题

  • 是否有直接的方法来了解Windows上的进程是否处于活动状态? 试图避免在完整的任务列表中搜索或使用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实例启动进程。 这种方法的优点是,您可以完全确定正在运行的进程是您启动的进程。 使用tasklist,普通用户可以以名称作为目标启动进程,或者在程序关闭时重用pid。

有关如何启动流程的信息,请参阅问题。

 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));

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM