gpt4 book ai didi

java - JAVA如何在linux中获取java.lang.Process的PID

转载 作者:太空宇宙 更新时间:2023-11-04 09:13:21 24 4
gpt4 key购买 nike

我想出了两种方法来解决这个问题,但都达不到预期。

  1. 我使用“进程”来执行“ps -ef”

    我可以通过这个方法获取所有行,我可以通过我的运行来过滤它们命令。但是如果我有很多相同的命令进程。这是行不通的。

  2. 我用JNA获取PID



Field field = null;
Integer pid = -1;
try {
Class clazz = Class.forName("java.lang.UNIXProcess");
field = clazz.getDeclaredField("pid");
field.setAccessible(true);
pid = (Integer) field.get(process);
} catch (Throwable e) {
e.printStackTrace();
}

这种方式只能得到运行窗口的PID。它不是进程的真实 PID。

我该怎么办?

谢谢!

最佳答案

Java 9

Java 9 引入了一些“不错”的变化,其中之一是包含了 Process 的 native PID - 请参阅 Process#pid了解更多详情

import java.io.IOException;
import java.io.InputStream;

public class Test {

public static void main(String[] args) throws IOException, InterruptedException {
ProcessBuilder pb = new ProcessBuilder("/Applications/Xcode.app/Contents/MacOS/Xcode");
pb.redirectErrorStream(true);
Process p = pb.start();
// Yes, I'm a bad developer, but I just want to demonstrate
// the use of the PID method :/
new Thread(new Consumer(p.getInputStream())).start();
System.out.println("PID = " + p.pid());
p.waitFor();
System.out.println("Exit with " + p.exitValue());
}

public static class Consumer implements Runnable {
private InputStream is;

public Consumer(InputStream is) {
this.is = is;
}

@Override
public void run() {
try {
int value = -1;
while ((value = is.read()) != -1) {
// I'm ignoring it for brevity
}
} catch (IOException ex) {
ex.printStackTrace();
}
}
}

}

您还可以获得对 ProcessHandle 的引用通过 Process#toHandleProcess方法,有点不错

关于java - JAVA如何在linux中获取java.lang.Process的PID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51868487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com