在 Linux 系统上,catalina.sh 中的 stop 命令接受超时参数,该参数会在指定的秒数后强制终止 tomcat。但是 catalina.bat 似乎没有这样的参数。我们遇到的问题是,我们的 tomcat(作为 Windows 服务运行)在net stop tomcat
发出时拒绝关闭。在 Windows 机器上实现此行为的最佳方法是什么?我看过关于使用的帖子taskkill
,但我如何才能最好地找出该进程是否仍在我的脚本(powershell)中运行。
答案1
此示例假设服务名称和进程名称都是“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
}
答案2
Tomcat作为Windows服务运行,由Windows服务管理器控制。
当您执行网络停止时,我估计停止命令已发送到 tomcat,但它只是需要更多时间才能完全停止。例如,如果您执行网络停止并等待足够长的时间,tomcat 最终会关闭。(FWIW,我自己在 Windows 服务器上管理一个 tomcat,所以这不是编造的,而是基于多年的实际经验。)
您可以使用 taskkill,这将立即终止它。您可以使用进程名称。如果代码仍在 tomcat 中运行(写入数据库或类似的东西),这可能会很混乱。
通常,最好的方法是执行 net stop 并等待它真正退出,或者要求应用程序开发人员使关机正常工作(例如,为了让应用程序更快地响应停止请求,以便 tomcat 立即关闭)。
除此之外,如果您不担心终止会产生什么影响,那么 taskkill 也是可以的。