java - 读取 ProcessBuilder 或 DefaultExecutor 启动的 "RunAs"子进程的标准输出

标签 java runtime.exec processbuilder runas

我正在尝试使用 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/

相关文章:

java - 当我将参数传递给无法比较时,ProcessBuilder 不工作

java - ProcessBuilder 重定向输出

java - ProcessBuilder 没有正确执行 Java 类文件

java - Android UTF-8编码引号

java - 除了按钮之外,一切正常。图形用户界面Java

java - 将Java程序运行到另一个程序中

java - 来自 Java 的 Python GUI

java - Maven 1.0.2 与 Java 5 兼容吗?

java - Apache Mina SFTP SftpSubsystem.Factory()

java - 为什么我不能在 Java 运行时使用日志文件