java线上系统中万恶的System.exit,tomcat意外退出
转载:http://www.chenzongyong.cn/article-detail-article_id-438.html
故事是这样的:
某天晚上,本君正与好友把酒言欢,从人生哲学聊到诗词歌赋,从痴男怨女聊到人生理想,正在我们详谈甚欢的时候,本君不经意的看了眼桌子上亮屏了的手机(因为怕被打扰事先静音了),然后看到了几十个未接电话,几十条微信、QQ消息,打开一看,发现一个惊人噩耗,线上系统在这么美妙的夜里,竟然down掉了,对,就是down掉了,当时心中一阵慌~~~~~~
待我花了几秒钟镇定了下心情之后,打开电脑,发现API的tomcat全部被关闭了,于是以迅雷不及掩耳之势重启了线上服务,成功化解了一场悲催的浩劫。
但是...
tomcat为什么会突然down掉呢?tell me why?
作为一个正规中举的程序猿大叔,遇到问题第一件事当然是查日志啦。。。。
排查后发现不是jvm crash,日志里有进程销毁的记录。
打开catalina日志,这样一句话像刀一样刺入眼帘:
May 21, 2018 4:01:41 PM org.apache.coyote.AbstractProtocol pause
INFO: Pausing ProtocolHandler ["http-nio-8080"]
May 21, 2018 4:01:41 PM org.apache.catalina.core.StandardService stopInternal
INFO: Stopping service Catalina
May 21, 2018 4:07:02 PM org.apache.catalina.startup.SetAllPropertiesRule begin
WARNING: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxSpareThreads' to '2000' did not find a matching property.
May 21, 2018 4:07:02 PM org.apache.catalina.startup.SetAllPropertiesRule begin
WARNING: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'minProcessors' to '100' did not find a matching property.
May 21, 2018 4:07:02 PM org.apache.catalina.startup.SetAllPropertiesRule begin
WARNING: [SetAllPropertiesRule]{Server/Service/Connector} Setting property 'maxProcessors' to '2000' did not find a matching property.
what fuck,谁关了了我的tomcat?你站出来,我保证让你重新认识下这个世界。但是冷静分析一下:
一、这并非正常的关闭。因为正常关闭(viaport)的话会在 pause 之前有这样的一句warn日志:
org.apache.catalina.core.StandardServer await
A valid shutdown command was received via the shutdown port. Stopping the Server instance.
然后才是 pause -> stop -> destory ;
二、tomcat的shutdownhook被触发,执行了销毁逻辑
而这又有两种情况,一是应用代码里有地方用System.exit来退出jvm,二是系统发的信号(kill -9除外,sigkill信号JVM不会有机会执行shutdownhook)
于是CTRL+H查找整个项目,然后发现了这个万恶的System.exit(0);代码如下:

对,你没看错,就是红框里的那句,就是那句,就是那句,重要的事情说三遍.......
这是使用的第三方的工具包,但是没想太多,直接拿过来使用了,没想到会有这么大个坑,当遇到特殊情况,不满足if条件的时候就会被执行,然后你懂得,tomcat就很听话的关闭了!!!!!
当然除了这中情况以外,还有以下情况也会导致tomcat的意外退出:
那就是当我们startup后,会习惯性的去执行 tail -f catalina.out来查看日志,看程序是否正常启动执行,但是~~~~~如果在你没有结束查看日志进程的时候强行关闭ssh回话,也会一定概率的导致tomcat意外退出。

浙公网安备 33010602011771号