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

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

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

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

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

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

Ответы [ 2 ]

10 голосов
/ 04 ноября 2008

Как вы сказали, addShutdownHook - это путь.

НО:

  • Нет реальной гарантии, что ваши перехватчики завершатся, если программа завершится. Кто-то может убить процесс Java, и в этом случае ваш хук завершения не будет выполнен. (как сказано в этом ТАК вопрос )

  • некоторые стандартные библиотеки имеют свои собственные хуки, которые могут запускаться раньше ваших.

  • Остерегайтесь тупиков.

Другой возможностью было бы обернуть вашу Java-программу в службу .

9 голосов
/ 04 ноября 2008

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

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));
...