0

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

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

4

2 回答 2

0

我最终创建了一个方法,该方法将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 之外,它还没有在其他任何东西上进行过测试,但我希望这对其他人来说是一种有用的方法。

于 2019-09-09T21:44:48.250 回答
0

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

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

我希望这有帮助

于 2019-09-01T03:33:24.097 回答