Java: Process Builder создает зомби
Я что-то здесь не так делаю? Не обрабатываете поток правильно?
Я запускаю процесс здесь (в частности: mvn exec:java
) и процесс не прекращается, даже если я запускаю p.killForcibly()
,
Если я пойду в командную строку и попытаюсь taskkill /F /PID
на pid, который я получаю из библиотеки flapdoodle, я получаю "доступ запрещен", и процесс продолжается.
try {
ProcessBuilder builder = new ProcessBuilder(commands);
log.createNewFile();
builder.redirectErrorStream(true);
builder.redirectOutput(Redirect.appendTo(log));
final Process p = builder.directory(dir).start();
Long pid = de.flapdoodle.embed.process.runtime.Processes.processId(p);
System.out.println("pid: " + pid);
class InnerRunner implements Runnable {
public void run() {
try {
int rc = p.waitFor();
if (callback != null)
callback.onComplete(rc);
} catch (InterruptedException ie) {
throw new RuntimeException("process was interuppted", ie);
}
}
}
Thread t = new Thread(new InnerRunner());
return p;
} catch (IOException ioe) {
throw new RuntimeException ("Failed to run process: " + commands + ". Ran it in: " + dir.getAbsolutePath(), ioe);
} catch (Throwable t) {
throw new RuntimeException("err", t);
}
Thread t = new Thread(new InnerRunner());
Возможная подсказка: выходной файл журнала, на который я перенаправляю вывод процессов, все еще остается открытым процессом. Я не могу удалить его, пока не убью процесс в диспетчере задач.