Francisco Romero
Francisco Romero

Reputation: 13199

How to check if a process is running on Windows?

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:

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:

Thanks in advance!

Upvotes: 5

Views: 22468

Answers (4)

Adir Dayan
Adir Dayan

Reputation: 1617

You can implement such method easily using Java 9:

public boolean isProcessRunning(String processName)
{
    return ProcessHandle
        .allProcesses()
        .filter(p -> p.info().command().isPresent())
        .anyMatch(n -> n.info().command().orElse("").endsWith(processName));
}

Note: I used endsWith(..) because the command contains the full path of the executed file. BTW if you have the PID, look on the accepted answer.

Upvotes: 0

pan
pan

Reputation: 1967

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

}

Upvotes: 1

Leet-Falcon
Leet-Falcon

Reputation: 2147

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

Upvotes: 11

Ferrybig
Ferrybig

Reputation: 18834

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.

Upvotes: 0

Related Questions