一个脚本引发的血案
诡异的脚本
做完上面的优化之后,我们感觉问题应该解决了,但过了一段时间后tomcat又诡异的挂了,继续分析gc情况,分阶段使用jmap -dump:live,format=b,file=dump.hprof xxx命令生成堆转储快照来对比堆内存使用情况,监控线程使用情况,均发现没有问题。这个问题困扰了我们好几天,每天都监控这端口,一但发现tomcat down之后马上通知运营人员重启。一方面我们也查阅了各种资料,到网上查找各种tomcat自动down的原因,一一在我们服务器进行了测试、修复均不起作用。
终于在google各种tomcat down原因的时候发现了这么一篇文章Tomcat进程意外退出的问题分析,立刻想起了我们最近使用的一个脚本来,因为我们的tomcat禁止了通过bat文件来关闭,因此为了启动方便我们写了一个脚本文件,方便通过脚本来启动、停止、重启tomcat文件,这是这个脚本导致tomcat down的原因,不不,不叫原因叫元凶!脚本内容如下:
#!/bin/sh
# eg: tomcat.sh start xxx
#
proc_dir="/usr/local/xxx/tomcat-zc-web/bin"
proc_name=$2
if [ x$proc_name != x ]
then
    proc_dir=${proc_dir//xxx/$proc_name}
fi
#echo $proc_dir
function stop () {
  kill -9 `ps -ef |grep $proc_dir |grep -v grep|awk '{print $2}'`
}
function start () {
  cd $proc_dir
  ./startup.sh
  tail -300f /usr/local/logs/tomcat-business/$proc_name.log
}
case $1 in 
  start)
    start;;
  stop)
    stop;;
  restart)
    stop
    start;;
esac就是因为tail -300f /usr/local/logs/tomcat-business/$proc_name.log这一句导致的问题,在别的项目使用的时候其实是没有这一句的,一般在使用的步骤是:
- 1 执行tomcat.sh start xxx启动tomcat,
- 2 执行tail -300f /usr/local/logs/tomcat-business/xxx.log查看启动日志是否成功。
在这次投产的时候为了省一步操作,就将执行查看日志的命令,直接加在了启动命令的后面,当执行tomcat.sh start xxx这个命令的时候,即启动的tomcat,也自动会打印出tomcat的日志,那时候的想法非常好。
原因是,使用脚本命令启动后因为使用了tail -300f xxx 命令,tomcat的进程会成为shell脚本的子进程,这样的话,如过shell脚本停止的话,系统会自动杀掉tomcat进程导致tomcat down掉,在我们的脚本中去掉这条命令tomcat就正常了,更深层次的原因参考Tomcat进程意外退出的问题分析这篇文章,文章的内容还是分析的比较透彻,最后感觉阿里的技术真的很牛X,这篇文章也是出自于阿里的员工。
经历这么些波折,后续的tomcat服务终于稳定了下来
作者:纯洁的微笑
出处:https://www.cnblogs.com/ityouknow/p/6392426.html
版权归作者所有,转载请注明出处
作者:Kero小柯
出处:http://www.cnblogs.com/kesimin/
本文版权归作者和博客园共有,欢迎转载,但必需注明出处,并且在文章页面明显位置给出原文连接。

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号