Проблемы с уничтожением дочернего процесса, вызванного в Java - PullRequest
3 голосов
/ 14 октября 2010

Внутри моей программы я вызываю процесс Linux, читаю вывод этого процесса, обрабатываю его и затем засыпаю до следующей итерации. У меня проблема в том, что процесс, который я вызываю, не всегда умирает, даже когда я делаю childProcess.destroy(). Вот код:

while(true) {
   Process childProcess = Runtime.getRuntime().exec("./getData");
   InputStream input = childProcess.getInputStream();
   BufferedReader inPipe = new BufferedReader(new InputStreamReader(input));
   while((lineRead = inPipe.readLine()) != null) {
      // do stuff
   }
childProcess.destroy();
inPipe.close();
input.close();
}

Подавляющее большинство времени, ./getData запускается, корректно завершается, и моя программа работает как надо. Но .... иногда он не выходит и просто сидит, потребляя процессор. Мне нужен способ убить его. Я также пытался добавить это, прежде чем я вызову его, но это не сработало:

Process killGetData = Runtime.getRuntime().exec("pkill -9 getData");
killGetData.destroy();

Я предполагаю, что, возможно, я застреваю во внутреннем цикле while ().

Любые мысли, идеи и советы с благодарностью получены. Большое спасибо заранее

John

1 Ответ

1 голос
/ 14 октября 2010

Вы должны закрыть входной канал до дочернего процесса, чтобы завершить его.Добавьте

childProcess.getOutputStream().close();

(это выходной поток для родительского процесса, но вход для дочернего процесса).

[EDIT] Также не забудьте вызвать childProcess.waitFor() для очисткизомби процесс.

...