Как я могу избавиться от дочерних процессов Java, когда мое приложение Java выходит из строя?
Я запускаю дочерний процесс на Java следующим образом:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Теперь он работает в фоновом режиме. Все хорошо и прекрасно.
Если моя программа теперь выйдет из строя (она все еще находится в dev:-)), дочерний процесс все еще, кажется, висит вокруг. Как я могу сделать это автоматически, когда родительский процесс Java умирает?
Если это помогает, я использую Mac OS X 10.5
Ответы
Ответ 1
Как вы сказали, addShutdownHook - это путь.
НО:
-
Нет никакой реальной гарантии, что ваши выключения будут выполняться, если программа завершается. Кто-то может убить процесс Java, и в этом случае ваш крюк остановки не будет выполнен. (как сказано в этом вопросе СО)
-
у некоторых стандартных библиотек есть свои собственные крючки, которые могут выполняться до вашего.
-
остерегайтесь взаимоблокировок.
Другая возможность - обернуть вашу java-программу в службу.
Ответ 2
Я сам это проработал. Я добавляю крюк отключения, как показано ниже:
final String[] cmd = {"<childProcessName>"};
final Process process = Runtime.getRuntime().exec(cmd);
Runnable runnable = new Runnable() {
public void run() {
process.destroy();
}
};
Runtime.getRuntime().addShutdownHook(new Thread(runnable));