【问题标题】:Read stdout of "RunAs" child process started by ProcessBuilder or DefaultExecutor读取由 ProcessBuilder 或 DefaultExecutor 启动的“RunAs”子进程的标准输出
【发布时间】:2013-08-02 21:26:04
【问题描述】:

我正在尝试使用 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 的执行

【问题讨论】:

  • 试试 processBuilder.redirectOutput(Redirect.INHERIT) stackoverflow.com/questions/10540631/…
  • @MGorgon 这无济于事。问题是 OP 想要的输出没有出现在正在创建的子进程中,而是出现在由RunAs 启动的另一个分离进程中。
  • 这无济于事,因为我们使用的是 Java 6,而 processBuilder.redirectOutput(Redirect.INHERIT) 仅存在于 Java 7 中,我不允许将项目更改为最新的 Java

标签: java runtime.exec processbuilder runas


【解决方案1】:

据我所知,微软的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 指示符。

【讨论】:

  • 如何在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 使用 & 在同一命令行中从 echo 添加文本并将其附加到同一日志的末尾文件:cmd.log 使用 >> 追加
  • 也使用2> 将stdout 和stderr 复制到一个文件中,在我的例子中是cmd.log
  • 我添加了您的 cmets 以“完成”答案。很抱歉最初没有提供完整的 shell 命令。
猜你喜欢
  • 2014-10-29
  • 1970-01-01
  • 2011-02-17
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多