Как мне избавиться от дочерних процессов Java, когда мое приложение Java завершает работу / дает сбой?

Я запускаю дочерний процесс на Java следующим образом:

final String[] cmd = {"<childProcessName>"};
Process process = Runtime.getRuntime().exec(cmd);

Теперь он работает в фоновом режиме. Все хорошо и хорошо.

Если моя программа теперь вылетает (она является все еще находится в разработке :-)), дочерний процесс, кажется, все еще зависает. Как я могу заставить его автоматически завершаться, когда родительский процесс Java умирает?

Если это поможет, я использую Mac OS X 10.5.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
15
0
9 172
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Сам уже разобрался. Я добавляю ловушку отключения, как показано ниже:

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 06.03.2021 12:39

@Pang Спасибо. Спустя более 12 лет это неудивительно. Я восстановил ссылку.

VonC 06.03.2021 13:30

Добавление ловушки выключения - ненадежный способ убить дочерние процессы. Это связано с тем, что ловушка завершения работы не обязательно может выполняться, когда выполняется принудительное уничтожение из диспетчера задач.

Один из подходов заключается в том, что дочерний процесс может периодически отслеживать PID своего родителя. Таким образом, дочерний процесс может завершиться сам по себе при выходе из родительского.

Другие вопросы по теме