我正在尝试使用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执行时(或至少在其执行完毕时)获取该jar的标准输出。还需要能够在该jar到达timelimt时终止该jar的执行
最佳答案
根据我的阅读,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
指示符。