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




Сам уже разобрался. Я добавляю ловушку отключения, как показано ниже:
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));
Как вы сказали, addShutdownHook - это то, что вам нужно.
НО:
Нет никакой реальной гарантии, что ваши перехватчики завершения работы будут выполнены, если программа завершится. Кто-то может убить процесс Java, и в этом случае ловушка завершения работы не будет выполнена. (как сказано в этом ТАК вопрос)
некоторые из стандартных библиотек имеют свои собственные перехватчики, которые могут запускаться раньше ваших.
остерегайтесь тупиковых ситуаций.
Другой вариант - оберните вашу Java-программу в сервис.
@Pang Спасибо. Спустя более 12 лет это неудивительно. Я восстановил ссылку.
Добавление ловушки выключения - ненадежный способ убить дочерние процессы. Это связано с тем, что ловушка завершения работы не обязательно может выполняться, когда выполняется принудительное уничтожение из диспетчера задач.
Один из подходов заключается в том, что дочерний процесс может периодически отслеживать PID своего родителя. Таким образом, дочерний процесс может завершиться сам по себе при выходе из родительского.
Первая ссылка в ответе кажется устаревшей.