Search code examples
javawindowsprocess

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:

  • 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!


Solution

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