【问题标题】:How to check is a certain process is running - java on linux如何检查某个进程是否正在运行 - linux上的java
【发布时间】:2015-07-12 10:52:54
【问题描述】:

我需要检查一个非 java 进程是否在 java 程序中运行(按进程名称) - 与 Java - how to check whether another (non-Java) process is running on Linux 中的问题非常相似。
解决方法可以,但是还是需要开启系统调用进程,我想避免这种情况。
有没有一种纯 java 的方式来获取 linux 上正在运行的进程列表?

【问题讨论】:

    标签: java linux process java-8


    【解决方案1】:

    在 Java 9 和更高版本中,有一个标准 API 可以解决这个问题,称为 ProcessHandle。下面是一个示例:

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

    它打印所有进程的 pid 和命令行(如果已知)。在 Windows 和 Linux 中运行良好。

    【讨论】:

      【解决方案2】:

      一个可能的解决方案可能是浏览 proc 条目。确实,这就是top 和其他人访问正在运行的进程列表的方式。

      我不完全确定这是否是您要寻找的,但它可以为您提供一些线索:

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

      【讨论】:

      • 这是个主意!猜猜你可以使用一些谓词使代码更清晰,但我认为这对我有用
      【解决方案3】:

      不,没有纯 Java 方法可以做到这一点。其原因可能是,进程是相当依赖于平台的概念。见How to get a list of current open windows/process with Java?(你也可以在那里找到对 Linux 有用的提示)

      【讨论】:

      • Java 是独立于平台的,所以这不是原因。但我花了足够的时间寻找解决方案,但没有找到......所以我猜ps 是。
      • @csny “Java 是独立于平台的,所以这不是原因”。我想你不明白托马斯的意思。如果 Java 支持的每个平台都难以实现或无法实现某些功能,那么 Java 的维护者可能会忽略它。
      猜你喜欢
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多