2

別のユーザーとして ProcessBuilder または apache DefaultExecutor を使用して Java を使用してプロセスを開始し、そのプロセスの 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のstdoutを取得できるようにしたいです。また、timelimt に達した場合、その jar の実行を終了できる必要があります

4

1 に答える 1

2

私が読んだところによると、Microsoft のrunasコマンドは、呼び出されると新しいターミナルを起動します。新しい端末からそれを呼び出した端末に戻る出力パイプはありません。推奨される最も近い解決策は、呼び出すコマンドの一部としてパイプを含めてrunas、新しいターミナルで実行されたコマンドの出力がファイルに書き込まれるようにすることです。この概念に従って、runasターミナルが終了する前にフラグ/シグナル ファイルを最後に書き込むこともできます。

これは 1 行で行われます。

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"

最後の部分は、ターミナルで 2 番目のコマンドを発行するために& echo about to close terminal>>cmd.log使用します。テキスト fromは、同じログ ファイルの最後に追加されます。出力ファイルを読み取るプログラムは、サブプロセスが完了したことを示すインジケーターとしてそのテキストを探す必要があります。&RunAsechocmd.log>>poison pill

于 2013-08-02T21:43:43.510 に答える