2013-08-02 2 views
2

Я пытаюсь запустить процесс с использованием Java либо с помощью ProcessBuilder, либо с помощью apache DefaultExecutor как другого пользователя и иметь возможность читать stdout этого процесса: Пример кода, который я имеют:Чтение stdout дочернего процесса «RunAs», запущенного ProcessBuilder или 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, который ничего не возвращает и главное, что он возвращает до завершения этого процесса. Я не хочу продолжать выполнение моей программы до завершения выполнения этой банки, и я также хочу иметь возможность получить stdout этой банки во время ее выполнения (или, по крайней мере, когда она закончит выполнение). Также необходимо иметь возможность прекратить выполнение этой банки, если она достигает timelimt

+0

Попробуйте processBuilder.redirectOutput (Redirect.INHERIT) http://stackoverflow.com/questions/10540631/how-to-redirect-child-process-stdout-stderr-to-the-main-process-stdout- stderr-in – MGorgon

+0

@MGorgon, который не поможет в качестве ответа. Проблема заключается в том, что вывод, который требуется OP, не возникает в создаваемом подпроцессе, а вместо этого в еще одном отсоединенном процессе, который запускается «RunAs». –

+0

Это не поможет, так как мы используем Java 6 и 'processBuilder.redirectOutput (Redirect.INHERIT)' существует только в Java 7, и мне не разрешено менять проект на новейшую Java – user2647364

ответ

2

Из того, что я прочитал, команда Microsoft 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, который завершен подпроцессом.

+0

Как добавить флаг/сигнал, написанный до выхода терминала «runas»? – user2647364

+0

'echo" done "> DONE' –

+0

Спасибо, Тим, на самом деле добрался до этого ответа, ожидая ответа. Для тех, кому это понадобится позже, вы можете сделать все в одной строке: '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 close terminal >> cmd.log "' Последняя часть '& echo close to close terminal >> cmd.log' делает добавление текста из' echo' в той же командной строке используя '&' и добавляя его к концу того же файла журнала: 'cmd.log', используя' >> 'для append – user2647364