У нас есть внутренние дебаты по этому поводу. Запуск jboss eap 7 на RHEL. В настоящее время у нас есть сценарий для остановки сервера, просто запустив kill -9
о процессе Java.
Мое предложение состояло в том, чтобы использовать правильную команду jboss для завершения работы:
jboss-cli --connect --commands=:shutdown
Как мы гарантируем, что jboss корректно закрыт от убийства? Я настаиваю на использовании команды jboss.
Если программное обеспечение нетривиально и поставляется с задокументированными средствами его выключения, как здесь, как представляется, используйте то, что есть. (Может быть несколько вариантов.)
Что касается SIGKILL
(сигнал 9
) конкретно, в этом нет ничего изящного.
Целевой процесс не может перехватить и обработать этот сигнал; он просто немедленно завершается, не успевая закончить то, что он делал, или выполнить какую-либо очистку, которую он обычно делал бы перед завершением работы.
Что касается сигналов в целом, если целью является некоторая форма плавного завершения работы, посмотрите, как программное обеспечение обрабатывает SIGTERM
и / или SIGINT
. Программное обеспечение, по крайней мере, имеет возможность их учитывать и корректно завершать работу.
SIGKILL
следует рассматривать как крайнее средство, если корректное завершение работы службы не работает.
Просто предположить каждый пистолет заряжен и каждый приложение signal 9 unsafe
. Если предположить, что в противном случае вы, скорее всего, потратите огромное количество времени на отладку случайных сбоев, вызванных такими простыми вещами, как принудительное завершение работы, которое произошло во время ротации файла журнала.
Быть signal 9 safe
означает ограничение изменений состояния атомарными транзакциями, и очень немногие приложения с отслеживанием состояния действительно это делают.
В мире Java вы не сможете время от времени убивать то, что застряло. Но ваш основной метод завершения работы приложения должен быть изящным, и любой отказ от завершения работы с помощью этого метода должен подвергаться по крайней мере такой же проверке, как и любая другая ошибка в вашем программном стеке.
Согласно официальному документу RedHat, сигналы SIGHUP, SIGINT и SIGTERM запускают плавное завершение работы. SIGKILL (kill -9) - нет.