我正在尝试使用 Java 启动一个进程,或者使用 ProcessBuilder 或 apache DefaultExecutor 作为另一个用户,并且能够读取该进程的标准输出: 我拥有的示例代码:
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 的执行
最佳答案
据我所知,微软的 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 closeterminal>>cmd.log
使用&
在RunAs
终端中发出第二个命令。来自 echo
的文本被附加到同一日志文件的末尾:cmd.log
,使用 >>
进行附加。然后,读取输出文件的程序必须查找该文本作为子进程已完成的毒丸
指示符。
关于java - 读取 ProcessBuilder 或 DefaultExecutor 启动的 "RunAs"子进程的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18026393/