如何用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

我想出了两种方法来解决这个问题,但都没有达到预期的效果

  • 我使用“流程”执行“ps-ef”

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

  • 我使用JNA获取PID

  • 这种方法只能得到运行窗口的PID。这不是过程的真实PID

    我该怎么办

    谢谢

    爪哇9 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();
                }
            }
        }
    
    }
    
    您还可以通过该方法获得
    进程的
    的引用,该方法有点不错

    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