0

我正在编写一个使用 apache 的默认执行程序运行命令行的代码。我找到了获取退出代码的方法,但我找不到获取进程 ID 的方法。

我的代码是:

protected void runCommandLine(OutputStream stdOutStream, OutputStream stdErrStream, CommandLine commandLine) throws InnerException{
DefaultExecutor executor = new DefaultExecutor();
    PumpStreamHandler streamHandler = new PumpStreamHandler(stdOutStream,
            stdErrStream);
    executor.setStreamHandler(streamHandler);
    Map<String, String> environment = createEnvironmentMap();
try {
        returnValue = executor.execute(commandLine, environment);
    } catch (ExecuteException e) {
       // and so on...
        }
        returnValue = e.getExitValue();
        throw new InnerException("Execution problem: "+e.getMessage(),e);
    } catch (IOException ioe) {
        throw new InnerException("IO exception while running command line:"
                + ioe.getMessage(),ioe);
    }
}

我应该怎么做才能获得 ProcessID?

4

2 回答 2

3

无法使用 apache-commons API(也无法使用底层Java API)来检索进程的 PID。

“最简单”的事情可能是让你的外部程序以这样一种方式执行,即程序本身以某种方式在它生成的输出中返回它的 PID。这样您就可以在您的 java 应用程序中捕获它。

很遗憾java没有导出PID。十多年来,它一直是一个功能请求。

于 2013-03-24T17:14:33.650 回答
1

在 Java 9 及更高版本中有一种方法可以检索 Process 对象的 PID。但是,要访问 Apache Commons Exec 中的 Process 实例,您将需要使用一些未记录的内部结构。

这是一段适用于 Commons Exec 1.3 的代码:

DefaultExecutor executor = new DefaultExecutor() {
    @Override
    protected Process launch(final CommandLine command, final Map<String, String> env, final File dir) throws IOException {
        Process process = super.launch(command, env, dir);
        long pid = process.pid();
        // Do stuff with the PID here... 
        return process;
    }
};
// Build an instance of CommandLine here
executor.execute(commandLine);
于 2018-09-18T09:57:13.693 回答