2011-08-20 6 views
0

Я использую ProcessBuilder, чтобы создать дочерний процесс для выполнения записи некоторых данных в файловую систему. И проблема возникает из-за того, что родительский процесс может неожиданно аварийно завершаться/убивать, дочерний процесс просто зависает, даже если я использую, например. jps проверяет, завершается ли его родительский процесс. Каков правильный путь для порожденного дочернего процесса обнаружить, если его родительский процесс мертв, а затем выйти?Завершение работы с дочерним процессом java изящно

Кроме того, после поиска в Интернете большинство решений используют Runtime.addShutdownHook(), но это не указано в ProcessBuilder. Имеет ли он один эквивалент?

ответ

1

Вы сделали хороший поиск по этой проблеме. Поэтому вы можете использовать возвращаемую ссылку на экземпляр Process и метод Runtime.addShutdownHook(Thread), о котором вы упомянули. Это последний шаг, который я считаю, что вам нужно взять с собой:


List commands = new ArrayList(); 
commands.add("xeyes"); // launch this command 
ProcessBuilder pb = new ProcessBuilder(commands); 
final Process p = pb.start(); 
Runtime.getRuntime().addShutdownHook(new Thread() { 
    @Override 
    public void run() { 
    p.destroy(); 
    } 
}); 

Thread.sleep(2000); // sleep for some time 
0

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

Смежные вопросы