如何查找进程是否在 Windows/Linux 上 运行

How to find whether a process is running on Windows/Linux

我希望我的程序能够检测 OBS-Studio 当前是否 运行,如果是,则在我的程序中执行某些功能。问题是我似乎无法找到适用于两个平台的解决方案。我在 windows 上找到了使用 taskListwmic.exe 和其他的东西,我在 [=] 上找到了使用 topps aux 和其他的东西23=],但是这些都是特定于平台的,不容易移植。是否有通用的用例,如果有,可能是什么?

我知道 Java9+ 中有 ProcessHandle,但是我的程序运行 Java8,目前没有升级的希望,所以这是不可能的。

我想不出适用于两个平台的解决方案, 也许使用类似下面的方法来确定 Java 中的操作系统,然后从那里使用条件语句来执行适合您的主机的代码部分。

os = System.getProperty("os.name"); 

希望对您有所帮助

我最终创建了一个方法,通过 运行 os-特定命令为所有进程 return Map<Integer, String>

public Map<Integer, String> getProcesses() {
    final Map<Integer, String> processes = Maps.newHashMap();
    final boolean windows = System.getProperty("os.name").contains("Windows");
    try {
        final Process process = Runtime.getRuntime().exec(windows ? "tasklist /fo csv /nh" : "ps -e");
        try (final BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            reader.lines().skip(1).forEach(x -> { // the first line is usually just a line to explain the format
                if (windows) {
                    // "name","id","type","priority","memory?"
                    final String[] split = x.replace("\"", "").split(",");
                    processes.put(Integer.valueOf(split[1]), split[0]);
                }
                else {
                    // id tty time command
                    final String[] split = Arrays.stream(x.trim().split(" ")).map(String::trim)
                            .filter(s -> !s.isEmpty()).toArray(String[]::new); // yikes
                    processes.put(Integer.valueOf(split[0]), split[split.length - 1]);
                }
            });
        }
    }
    catch (IOException e) {
        e.printStackTrace();
    }

    return processes;
}

这还没有在 Windows 上测试过,但应该可以。除了 Linux 之外,它还没有在其他任何东西上进行过测试,但我希望这对其他人来说是一种有用的方法。