Как мне избавиться от дочерних процессов Java, когда мое приложение Java завершает работу или выходит из строя?
-
06-07-2019 - |
Вопрос
Я запускаю дочерний процесс в Java следующим образом:
final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);
Теперь он работает в фоновом режиме.Все хорошо и прекрасно.
Если моя программа сейчас выйдет из строя (она является все еще в разработке :-)) дочерний процесс, похоже, все еще зависает.Как я могу автоматически завершить его, когда родительский процесс Java умирает?
Если это поможет, я использую Mac OS X 10.5.
Решение
Как вы сказали, добавитьShutdownHook это путь.
НО:
Нет никакой реальной гарантии, что ваши перехватчики завершения работы будут выполнены, если программа завершится.Кто-то может завершить процесс Java, и в этом случае перехватчик завершения не будет выполнен.(как сказано в этом ТАК вопрос)
некоторые стандартные библиотеки имеют свои собственные хуки, которые могут работать раньше ваших.
остерегайтесь тупиков.
Другой возможностью было бы оберните вашу Java-программу в сервис.
Другие советы
Я уже решил это сам. Я добавляю хук отключения следующим образом:
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));