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

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

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

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

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

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

Ответы

Ответ 1

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

НО:

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

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

  • остерегайтесь взаимоблокировок.

Другая возможность - обернуть вашу java-программу в службу.

Ответ 2

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

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