有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何获取java的PID。用JAVA实现linux下的lang.Process

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

  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

我该怎么办

谢谢


共 (1) 个答案

  1. # 1 楼答案

    爪哇9

    Java9引入了一些“不错”的更改,其中一个是包含了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();
                }
            }
        }
    
    }
    

    您还可以通过^{}方法获得^{}Process的引用,这有点不错