Как создать процесс, который умирает с помощью JVM

#java

#java

Вопрос:

Я хочу создать процесс, который получит SIGINT / SIGTERM / SIGKILL, когда текущая JVM умирает / выходит из строя.

Примечание 1: я знаю, что есть разница между SIGINT / SIGTERM / SIGKILL , но я не знаю, какой из них возможен.

Примечание 2: Я знаю о перехватчиках завершения работы, но мне хотелось бы более надежное решение (перехватчики работают только при изящных отключениях JVM).

Примечание 3: в настоящее время я использую ProcessBuilder для запуска длительного процесса переднего плана.

Комментарии:

1. Невозможно автоматически уничтожить дочерний процесс, как вы описываете.

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

3. @niqueco похоже, вы правы. Я нашел информацию, в которой говорится: «Когда какой-либо процесс, имеющий дочерние элементы, умирает по какой-либо причине, его дочерние элементы преобразуются в процесс с PID 1». Но я не понимаю, зависит ли это от ОС или от поведения POSIX.

4. Это больше, чем POSIX, это стандартное поведение UNIX. Если вы хотите, чтобы дочерний процесс завершился, вам нужно либо завершить его из родительского, либо использовать какой-либо механизм IPC, чтобы родитель мог сообщить дочернему процессу о завершении..