读取由ProcessBuilder或DefaultExecutor启动的“RunAs”子进程的stdout

时间:2013-08-02 21:26:04

标签: java runtime.exec processbuilder runas

我正在尝试使用Java启动一个进程,使用ProcessBuilder或apache DefaultExecutor作为另一个用户,并能够读取该进程的stdout: 我有的示例代码:

OutputStream out = null;
OutputStream err = null;
InputStream in = null;
String line = "runas /noprofile /user:dev /savecred /env \"java -cp myProj.jar com.myComp.myProj.Main -libjardirs target/lib\"";
CommandLine cmdLine = CommandLine.parse(line);
DefaultExecutor executor = new DefaultExecutor();
executor.setExitValue(0);

PumpStreamHandler streamHandler = new PumpStreamHandler(out, err, in);
executor.setStreamHandler(streamHandler);

streamHandler.start();
ExecuteWatchdog watchdog = new ExecuteWatchdog(60000);

executor.setWatchdog(watchdog);
int exitValue = executor.execute(cmdLine);

我尝试了不同的变化,但到目前为止没有运气。 Runas启动另一个执行的进程,但是stdout只从runas本身获取信息,它不返回任何内容,并且在该进程完成之前返回主要内容。 我不想在执行该jar之前继续执行我的程序,并且我还希望能够在执行时获取该jar的stdout(或者至少在它完成执行时)。如果达到timelimt

,还需要能够终止该jar的执行

1 个答案:

答案 0 :(得分:2)

根据我的阅读,Microsoft的runas命令在调用时启动一个新终端。新终端没有输出管道返回到调用它的终端。建议closest solution包括一个管道作为runas命令的一部分来调用,以便在新终端中运行的命令的输出被写入文件。按照这个概念,你也可以在runas终端退出之前写下一个标志/信号文件作为最后一件事。

这将在一行中完成:

runas /noprofile /user:dev /savecred /env "cmd.exe /c java -cp myProj.jar com.myComp.myProj.Main -libjardirs target/lib 2> cmd.log & echo about to close terminal>>cmd.log"

上一部分& echo about to close terminal>>cmd.log使用&RunAs终端发出第二个命令。来自echo的文本将附加到同一日志文件的末尾:cmd.log使用>>进行追加。然后,读取输出文件的程序必须查找该文本作为子过程已完成的poison pill指示符。