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

StackOverflow https://stackoverflow.com/questions/261125

Вопрос

Я запускаю дочерний процесс в 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));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top