如何查找进程是否在 Windows/Linux 上 运行
How to find whether a process is running on Windows/Linux
我希望我的程序能够检测 OBS-Studio 当前是否 运行,如果是,则在我的程序中执行某些功能。问题是我似乎无法找到适用于两个平台的解决方案。我在 windows 上找到了使用 taskList
、wmic.exe
和其他的东西,我在 [=] 上找到了使用 top
、ps 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 之外,它还没有在其他任何东西上进行过测试,但我希望这对其他人来说是一种有用的方法。
我希望我的程序能够检测 OBS-Studio 当前是否 运行,如果是,则在我的程序中执行某些功能。问题是我似乎无法找到适用于两个平台的解决方案。我在 windows 上找到了使用 taskList
、wmic.exe
和其他的东西,我在 [=] 上找到了使用 top
、ps 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 之外,它还没有在其他任何东西上进行过测试,但我希望这对其他人来说是一种有用的方法。