How to check is a certain process is running - java on linux

会有一股神秘感。 提交于 2019-12-24 03:31:03

问题


I need to check if a non-java process is running (by process name) inside a java program - very similar to the issue in Java - how to check whether another (non-Java) process is running on Linux.
The solution is ok, but it still needs to open a system call process, and I'd like to avoid this.
Is there a pure-java way to get a list of running processes on linux?


回答1:


A possible solution might be explorer the proc entries. Indeed, this is how top and others gain access to the list of running process.

I'm not completely sure if this is what your looking for, but it can give you some clue:

    import java.awt.Desktop;
    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;

    public class OpenFolder {
        public static void main(String[] args) throws IOException {
            System.out.println(findProcess("process_name_here"));
        }

        public static boolean findProcess(String processName) throws IOException {
            String filePath = new String("");
            File directory = new File("/proc");
            File[] contents = directory.listFiles();
            boolean found = false;
            for (File f : contents) {
                if (f.getAbsolutePath().matches("\\/proc\\/\\d+")) {
                    filePath = f.getAbsolutePath().concat("/status");
                    if (readFile(filePath, processName))
                        found = true;
                }
            }
            return found;
        }

        public static boolean readFile(String filename, String processName)
        throws IOException {
            FileInputStream fstream = new FileInputStream(filename);
            BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
            String strLine;
            strLine = br.readLine().split(":")[1].trim();
            br.close();
            if (strLine.equals(processName))
                return true;
            else
                return false;
        }
    }



回答2:


In Java 9 and later there is a standard API to solve this problem called ProcessHandle.Here's an example:

public class ps {
  public static void main(String[] args) {
    ProcessHandle.allProcesses()
                 .map(p -> p.getPid()+": "+p.info().command().orElse("?"))
                 .forEach(System.out::println);
  }
}

It prints the pid and command line (if known) for all processes. Works fine in Windows and Linux.




回答3:


No, there is no pure-java way how to do this. The reason for this probably is, that processes are quite platform-dependent concept. See How to get a list of current open windows/process with Java? (you can find useful tips also for Linux there)



来源:https://stackoverflow.com/questions/31366975/how-to-check-is-a-certain-process-is-running-java-on-linux

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