背景:
我们经常发现,利用jenkins执行重启tomcat的命令一直失败,job构建成功了,但是事实上tomcat并没有正确的重新启动。原因是这样:jenkins在执行sh脚本的时候,如果脚本中有启动后台进程的情况,例如tomcat的关闭和启动,jenkins在job构建结束之后,会kill所有的脚本里面衍生出的子进程。
场景一:jenkins和tomcat部署在在相同的机器
jenkins有一些环境变量,例如JOB_NAME、WORKSPACE、BUILD_ID等,一个小的技巧就是在执行sh shutdown.sh的命令前面,加上如下一条命令,修改环境变量BUILD_ID的值,这样,衍生出来的子进程就不会被kill了。
BUILD_ID=dontKillMe
举个简单的例子
sleep 10目的是为了让shutdown脚本执行结束,这么写是为了方便。为了确保这一点,读者可以用下面命令杀掉进程。
ps -ef | grep xxx | awk '{print $2}' | xargs kill -9
场景二:jenkins和tomcat部署在在不同的机器
这种场景下,会发现使用上面的方法不生效,这里介绍一种亲自试验过的方法。
假如部署jenkins的机器是A,部署tomcat的机器是B。那可以在A机器上写一个脚本,把需要在B机器上执行的命令封装在A机器上的这个脚本里面,这样也能保证衍生进程正确执行结束。
举个简单的例子
A机器上touch一个脚本,譬如tomcat-restart.sh
#!/bin/sh
# restart romote tomcat
# ssh to remote server
ssh work@xx.xxx.xx.xxx <<EOF
cd /home/work/services/apache-tomcat-8.5.8
./bin/shutdown.sh
sleep 10
./bin/startup.sh
exit
EOF
注意别忘记了最后的EOF(可以用任意字符串替换),表示之间的命令是在B机器上执行的。当然,脚本正确执行的前提是A和B之间建立了SSH的信任关系,如果不熟悉的话,可以自行去百度一下。然后,在execute shell里面执行tomcat-restart.sh脚本即可。