用systemctl status tomcat查看状态显示:PID file found but either no matching process was found or the current user
生产环境tomcat 在liunx系统中shutdown后进程仍然存在解决办法
最近我们在使用Jenkins自动化部署项目时,在生产liunx环境下,使用脚本shutdown.sh停止tomcat服务,然后再start之后发现应用无法访问了,后台查看tomcat进程是发现有个2个tomcat进程,说明之前的shutdown并没有完全停掉tomcat进程。那怎么样tomcat使用shutdown之后立马关掉其进程呢? 经查资料发现在shutdown.sh脚本之后有条命令是这样的:
这个就是停止tomcat 服务的命令,我们只需要加一个 -force 就可以在shutdown时强制关闭tomcat进程
但光这样还是不行,再shutdown时报错:
查找失败原因:
从中可以看到,首先是执行java命令失败,没有停止tomcat,然后执行-force模块的命令,但是却没有找到$CATALINA_PID设定的进程号,我们先不去关注java执行stop命令为什么报错,而是看看为什么加了-force参数也不起作用了
为什么没有$CATALINA_PID?接下来就带大家一探究竟
首先,我们将涉及到$CATALINA_PID变量的代码全部提取出来:
第一处:
#以下这句判断设置的$CATALINA_PID变量如果不存在,则显示"Using CATALINA_PID:
#貌似只是判断$CATALINA_PID是否是空字符,其他什么都没有做
第二处:(涉及到start参数的模块内的$CATALINA_PID变量,只是提出来分析,其实不对stop模块有影响)
第三处:
#如果发现$CATALINA_PID则发送一个模拟结束进程的型号,如果返回值为0,则正常,其他则异常,做退出操作
#从上面的sh -x输出的信息对应的是:'[' '!' -z '' ']' 可以看出$CATALINA_PID变量没有设定,所以这个判断直接就结束了,什么都没做
第四处:
第五处:
总结下,$CATALINA_PID在整个代码中的作用:
1.在tomcat启动时会写入$CATALINA_PID,但是假设我们的环境是多tomcat项目或$CATALINA_PID为空
2.stop代码中,检查$CATALINA_PID是否为空字符,是的话什么都不做
3.sstop代码中,检查$CATALINA_PID是否为空字符,是的话什么都不做
4.force代码中,检查$CATALINA_PID是否为空字符,是的话就报错
也就是说只要没有保存中这个项目的PID,那么正常stop停止不了,-force也是没有用的。
那么该如何解决呢?直接给$CATALINA_PID付PID的值,那么看结果:
涉及到的代码:
#$CATALINA_PID不是个文件,所以不好意思,我退出了....
原来$CATALINA_PID还必须是个文件,那么我们可不可以建这么一个文件呢?
在catalina.sh脚本的代码前,加入以下语句:
总结:
在我看到的很到部署tomcat的文章中,还没发现有关于设置$CATALINA_PID文件路径的提示(也许是我看到的少),但是此处我要建议小伙伴们,在写tomcat启动、停止、重启的脚本的时候,一定要注意这个变量。
---------------------
作者:hxyerui
来源:CSDN
原文:https://blog.csdn.net/hxyerui/article/details/52181884
版权声明:本文为博主原创文章,转载请附上博文链接!