2

我正在尝试使用 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 的标准输出。如果它达到timelimt,还需要能够终止该jar的执行

4

1 回答 1

2

根据我的阅读,微软的runas命令在调用时会启动一个新终端。没有从新终端返回到调用它的终端的输出管道。建议的最接近的解决方案是在要调用的命令中包含一个管道,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使用>>for append。然后,读取输出文件的程序将不得不寻找该文本作为poison pill子流程已完成的指示符。

于 2013-08-02T21:43:43.510 回答