В системах linux команда stop в catalina.sh принимает параметр тайм-аута, который принудительно убивает tomcat по истечении заданного количества секунд. Однако, похоже, что у catalina.bat нет такого параметра. У нас возникают проблемы с тем, что наш tomcat (работающий как служба Windows) отказывается завершать работу, когда net stop tomcat
выпущен. Как лучше всего реализовать это поведение в окне Windows? Я видел сообщения об использовании taskkill
, но как мне лучше всего узнать, что процесс все еще выполняется в моем сценарии (PowerShell).
В этом примере предполагается, что имя службы и имя процесса - «tomcat».
# Ask service, nicely, to stop
Stop-Service -Name 'tomcat'
# Give service a bit to tidy up.
Start-Sleep -Seconds 30
# If the service isn't stopped yet, end the process forcefully.
if ( (Get-Service -Name 'tomcat').Status -ne 'Stopped' ) {
Stop-Process -ProcessName 'tomcat' -Force
}
Tomcat, работающий как служба Windows, управляется диспетчером служб Windows.
Когда вы делаете чистую остановку, я предполагаю, что команда остановки отправляется tomcat, но ему просто нужно больше времени, чтобы полностью остановиться. Например. если вы сделаете чистую остановку и подождете достаточно долго, tomcat в конечном итоге отключится. (FWIW, я сам управляю котом на сервере Windows, так что это не выдумано, а основано на реальном опыте за несколько лет.)
Вы можете использовать taskkill, это сразу же отключит его. Вы можете использовать имя процесса. Если код все еще работает в tomcat (запись в базу данных или что-то подобное), это может быть беспорядочно.
Лучшим подходом, как правило, является либо остановка сети и ожидание ее реального выхода, либо попросить разработчика приложения заставить завершение работы работать должным образом (например, чтобы приложение быстрее реагировало на запрос остановки, чтобы tomcat быстро отключился ).
В противном случае taskkill подойдет, если вас не беспокоит, каков будет эффект прерывания.