Tomcat изящное отключение - PullRequest
       22

Tomcat изящное отключение

0 голосов
/ 18 октября 2018

Я использую Tomcat 8.xx и запускаю tomcat с помощью startup.sh.Я проверил, что Tomcat запущен и работает с помощью команды JPS.Я останавливаю Tomcat, используя catalina.sh stop 100 .Согласно сценариям оболочки catalina, он будет ждать 100 секунд, чтобы завершить процесс tomcat.Но процесс tomcat был немедленно прекращен, что подтверждается командой JPS.

Почему не работает корректное завершение работы?

Как добиться постепенного завершения работы в Tomcat?

1 Ответ

0 голосов
/ 18 октября 2018

100 секунд - это время, в течение которого скрипт будет ожидать остановки процесса после выдачи сигнала уничтожения, прежде чем завершить его принудительно с помощью kill -9.То, что процесс быстро останавливается, не означает, что это не было чистое завершение.

Из раздела справки catalina.sh:

echo "  stop              Stop Catalina, waiting up to 5 seconds for the process to end"
echo "  stop n            Stop Catalina, waiting up to n seconds for the process to end"
echo "  stop -force       Stop Catalina, wait up to 5 seconds and then use kill -KILL if still running"
echo "  stop n -force     Stop Catalina, wait up to n seconds and then use kill -KILL if still running"

Обратите внимание на словоблудие , ожидающеедо n секунд ... процесс сразу сигнализируется, и сценарий ожидает до n секунд, пока PID исчезнет, ​​прежде чем он отправит сигнал kill -9.Обратите внимание, что скрипт catalina.sh спит по 1 секунде за раз, но только после того, как он отправил начальный сигнал выключения.

Вот соответствующие строки из скрипта, которые точно показывают, что происходит:

https://github.com/apache/tomcat/blob/a8c62dd061d4cf937c3bdec615121696916434eb/bin/catalina.sh#L525-L600

В общем:

  • Отправьте kill -15 процессу, что является нормальным постепенным завершением работы.Теперь JVM должна запустить свою последовательность завершения.
  • Отправьте kill -0 процессу, чтобы проверить, жив он или нет.Если он жив, поспите 1 секунду и проверьте снова.Повторяйте это до тех пор, пока либо а) процесс не перестанет быть активным, либо б) параметр задержки (в вашем случае, 100 секунд) истек.
  • Если процесс все еще жив на этоми вы указали аргумент -force, скрипт в последний раз пытается отправить сигнал kill -9 в JVM.Этот сигнал фактически не может быть обработан JVM, и сама ОС вызывает немедленное отключение процесса (т. Е. Не постепенное отключение).

Обратите внимание, что все это произошло сразу же, без каких-либо задержек.Если вы хотите сделать искусственную паузу перед выполнением последовательности выключения, описанной выше, вы должны использовать sleep перед вызовом catalina.sh:

sleep 100 && catalina.sh stop
...