How to check if a process is running on Windows?

谁说我不能喝 提交于 2021-02-11 05:10:40

问题


What I am trying to do it is a program to know if a process it is active on Windows to work with it in Java. I looked on the Internet and found two different solutions:

  • Option 1
  • Option 2

But it is not at all what I am looking for.

According to the option 1, I would like a method to make reference to the process (and detect if it is active/running) but without searching in the full tasklist and then searching on it. I am searching if there is a direct method to do that.

I also though to add a filter to the tasklist but could not find any filter to only get the process I am looking for. I saw all the options using tasklist /? on my command line.

Then I searched information about the second option and wmic (that I never heard before) and it seems that wmic allows you to execute tasks on the command line (correct me if I am wrong please).

So, here I have two questions:

  • Is there a direct method to know if a process is active on Windows with Java? Trying to avoid searching in the full tasklist or using wmic.

  • If it is impossible, what of the two options that I put above would be better if we talk about efficient programming?

Thanks in advance!


回答1:


There is no direct way to query general processes as each OS handles them differently.
You kinda stuck with using proxies such as direct OS commands...

You can however, find a specific process using tasklist.exe with /fi parameter.
e.g: tasklist.exe /nh /fi "Imagename eq chrome.exe"
Note the mandatory double quotes.
Syntax & usage are available on MS Technet site.

Same example, filtering for "chrome.exe" in Java:

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."



回答2:


With Java 9 you can do it like this:

Optional<ProcessHandle> processHandle = ProcessHandle.of(pid);
boolean isrunning = processHandle.isPresent() && processHandle.get().isAlive();

You are now also able, to get some info about the process directly with 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));

}



回答3:


The best way would be launching the process from the java instance. The advantages of this approach are that you can be fully sure that the process that is running, is the process you started. With tasklist, it is possible for normal users to start a process with the name as the target, or reuse the pid if the program closes.

For information how to start a process, see this question.

Process myProcess = Runtime.getRuntime().exec(command);

You can then use the methods of Process to monitor the state of the program, for example myProcess.exitValue() blocks until the program is closed.



来源:https://stackoverflow.com/questions/35129457/how-to-check-if-a-process-is-running-on-windows

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!