tomcat居然会有用shutdown脚本关不掉的时候,请教正确的重新启动姿势

今天早上更新了一下应用,shutdown.sh,再start.sh,然后发现所有的应用都无法访问了,就是没反应,也不回应拒绝访问等错误信息,就僵死在那里,检查了半天才发现在shtdown.sh后,仍然有进程在监听8080端口,导致重新启动tomcat时无法绑定端口而失败,继续google发现原来很多情况都能造成tomcat无法关闭线程(最典型的就是用了ssh框架)的情况,手动杀线程后搞定问题,但是这个问题实在太不爽了,我的tomcat是需要经常重启来更新测试应用的,这经常僵尸太不爽了,求正确的安全重启tomcat方法

做个重启tomcat的脚本

/your/tomcat/bin/shutdown.sh
sleep 5 #具体时间就看你得webapp在调用shutdown.sh后多久后处于僵死状态
ps -ef | grep 'tomcat' | grep -v grep| awk '{print $2}' | xargs kill -9
sleep 2
/your/tomcat/bin/startup.sh

ps -ef | grep 'tomcat' 此处的'tomcat'关键字需要能把你的tomcat进程找出来。

另外一种办法是把tomcat配置成服务,用service命令来重启和关闭

很多时候并不是spring的问题,是自己的代码问题。
是不是做了shutdown的钩子,一般都是这里面写得有问题。
1. 使用spring环境的bean,使用destory配置自行销毁资源的方法,而不是用系统钩子
2. 遇到实在kill不了的,等待10s后直接kill -9

重启之前查看一下tomcat在后台是否有进程,如果有杀掉就ok了啊

SSH对TOMCAT的关闭会有影响?能说一下是怎么个回事不?

可以实现一个ServletContextListener,然后在destory方法中退出jvm

ps ux|grep catalina 得到pid(一般会有两个,最长那个)
kill -9 '刚才得到的PID'

如下步骤可以:
1、./shutdown.sh 关闭tomcat
2、ps -ef|grep tomcat 查看是否还有tomcat进程在后台运行。如果有说明tomcat没有彻底关闭。
3、可以通过kill -9 pid方式关闭
4、重新第二步操作验证是否关闭。如果关闭ok执行第五步
5、./startup.sh 重新启动即可。

system.exit(1);

jdk假死直接挺进程..标准的关闭方式是shutdown...假死情况应该很少...你看看.是不是给tomcat的内存太小了..调整下...如果还有问题..就看代码吧..

killall tomcat