Выполнение команд оболочки из Java - PullRequest
6 голосов
/ 17 июня 2010

Я пытаюсь выполнить команду оболочки из Java-приложения на платформе GNU / Linux. Проблема в том, что скрипт, который вызывает другое Java-приложение, никогда не заканчивается, хотя он успешно запускается из bash. Я попытался отладить его:

(gdb) bt
#0  0xb773d422 in __kernel_vsyscall ()
#1  0xb7709b5d in pthread_join (threadid=3063909232, thread_return=0xbf9cb678) at pthread_join.c:89
#2  0x0804dd78 in ContinueInNewThread ()
#3  0x080497f6 in main ()

Я пытался с: ProcessBuilder (); и Runtime.getRuntime (). exec (cmd);

Похоже, что он ждет чего-то, чтобы закончить. Есть идеи?

Спасибо, Laurenţiu

1 Ответ

15 голосов
/ 17 июня 2010

Обрабатываете ли вы стандартный ввод и стандартный вывод?Из javadocs :

Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных потоков ввода и вывода, невозможность оперативно записать входной поток или прочитать выходной поток подпроцессаможет привести к блокировке подпроцесса и даже к тупику.

Process cmdProc = Runtime.getRuntime().exec(command);


BufferedReader stdoutReader = new BufferedReader(
         new InputStreamReader(cmdProc.getInputStream()));
String line;
while ((line = stdoutReader.readLine()) != null) {
   // process procs standard output here
}

BufferedReader stderrReader = new BufferedReader(
         new InputStreamReader(cmdProc.getErrorStream()));
while ((line = stderrReader.readLine()) != null) {
   // process procs standard error here
}

int retValue = cmdProc.exitValue();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...