分享按钮
RSS订阅

java线上系统中万恶的System.exit,tomcat意外退出

作者: 清逸成风 |来源:原创| 标签: java   system.exit   bug调试   tomcat意外退出  

    故事是这样的:

    某天晚上,本君正与好友把酒言欢,从人生哲学聊到诗词歌赋,从痴男怨女聊到人生理想,正在我们详谈甚欢的时候,本君不经意的看了眼桌子上亮屏了的手机(因为怕被打扰事先静音了),然后看到了几十个未接电话,几十条微信、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意外退出。