上篇《利用jenkins实现自动构建、部署,提升团队开发效率》 ,任务运行很不稳定,时好时坏,只能再再深入一下,结果又发现jenkins的被忽略的特性。
jenkins中自动构建helpcenter.jar文件,然后以在server上以shell脚本的形式启动jar服务。jenkins构建后,手动执行sh脚本,服务启动正常。但jenkins结合shell一起使用的话,jenkins的console中显示正常启动,但server中服务并未启动。什么原因呢?
排错的过程总是异常的艰辛,你懂的。
shell脚本如下:
#!/bin/sh
#defined
export JAVA_HOME=/usr/java/jdk1.7.0_79
MID=`ps -ef |grep java |grep helpcenter |awk '{print $2}'`
echo $MID
echo "kill helpcenter process"
if ["$MID" = ""]
then
echo "no helpcenter running"
else
echo "helpcenter running "
kill -9 $MID
fi
echo "copy the lasteset msgcenter jar file"
cp -rf /root/.jenkins/workspace/helpcenter/helpcenter/target/helpcenter.jar /home/tomcat/msgcenter
echo "start msgcenter jar file"
#get int to jar location
cd /home/tomcat/msgcenter
nohup java -Xms512m -Xmx1024m -jar helpcenter.jar &
echo "stared helpcenter jar file"
细看job console最下面一行信息显示:
Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information
大概意思是jenkins的job有构建结束后,会认为所有任务正常结束,但shell脚本会启动一个进程,job会认为其未结束,而将其kill掉,导致的现象就是刚启动的进程又被kill掉了。
网上翻阅了大量资料,有文章提出可通过daemonize工具,将程序作为实现良好的daemon进程运行以避免这个问题。在linux Server中安装daemonize工具,安装过程如下:
$ git clone http://github.com/bmc/daemonize.git
$ ./configure
$ make
$ make install
安装结束。
在jenkins中的shell配置的地方,添加最后一行命令行即可。
#!/bin/bash
cd /home/autoshell/
echo "------------------------------------>>>begin sh helpcenter-restart.sh"
sh msgcener-restart.sh
echo "------------------------------------>>>good ,start the helpcenter ........"
#关键命令
daemonize -E BUILD_ID=dontKillcenter /home/autoshell/helpcenter-restart.sh
重新启动jenkins job,测试是否正常使用。
参考资料:
http://software.clapper.org/daemonize/
http://alanland.iteye.com/blog/2047244
http://www.cnblogs.com/qcly/p/3219508.html
https://my.oschina.net/u/147181/blog/312599
传送门:
1、如何编写无须人工干预的shell脚本
2、利用jenkins实现自动构建、部署,提升团队开发效率
歪脖贰点零 ∣一个十年码农的日常碎碎念


长按,识别二维码,加关注,获取更多精彩内容