如何用java实现linux下java.lang.Process的PID
我想出了两种方法来解决这个问题,但都没有达到预期的效果如何用java实现linux下java.lang.Process的PID,java,linux,jna,Java,Linux,Jna,我想出了两种方法来解决这个问题,但都没有达到预期的效果 我使用“流程”执行“ps-ef” 我可以通过这个方法得到所有的行,我可以通过我的运行来过滤它们 命令。但如果我有很多相同的命令过程。这是不工作的 我使用JNA获取PID 这种方法只能得到运行窗口的PID。这不是过程的真实PID 我该怎么办 谢谢 爪哇9 Java9引入了一些“不错”的更改,其中一个是包含了进程的本机PID——有关更多详细信息,请参阅 import java.io.IOException; import java.io.I
进程的本机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();
}
}
}
}
您还可以通过该方法获得进程的的引用,该方法有点不错Java9
Java9引入了一些“不错”的更改,其中一个是包含了进程的本机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();
}
}
}
}
您还可以通过该方法获得流程的引用,这有点不错Java 9中有一个新的API,它应该可以工作-假设您使用了Java 9,您可以在执行Java程序后调用ps ef。因此,通过时间戳,您可以找到刚刚创建的新流程。或者,您可以为java程序设置param,使其具有唯一性。或者可以使用ManagementFactory.getRuntimeMXBean().getName()。这是工作的罚款linux@MadProgrammer这应该是一个答案。Dupe,这是反射,而不是JNA,这是非常不同的。Java 9中有一个新的API应该可以工作-假设您使用Java 9,您可以在执行Java程序后调用ps ef。因此,通过时间戳,您可以找到刚刚创建的新流程。或者,您可以为java程序设置param,使其具有唯一性。或者可以使用ManagementFactory.getRuntimeMXBean().getName()。这是工作的罚款linux@MadProgrammer这应该是一个答案。Dupe和这是反射,而不是JNA,这是非常不同的。当我在linux中使用进程时,它将有两个PID。例如:11102 1110411102是sh-c cd/usr/lib/projecthouse/github_project_1/target&&java-jar demo-0.0.1-11104是真正的PID(java-jar demo-0.0.1-SNAPSHOT.jar--spring.profiles.active=prod),但process.PID()总是得到第一个PID例如:11102,我应该做什么?不要使用shell脚本,在linux中使用process时直接执行java,它将有两个PID。例如:11102 1110411102是sh-c cd/usr/lib/projecthouse/github_project_1/target&&java-jar demo-0.0.1-11104是真正的PID(java-jar demo-0.0.1-SNAPSHOT.jar--spring.profiles.active=prod),但是process.PID()总是得到第一个PID ex:11102,我应该做什么?不要使用shell脚本,直接执行java