jenkins使用shell脚本执行nohup java -jar包失败
一、问题
通过jenkins执行shell脚本时,脚本中是通过nohup java -jar &的方式启动,显示执行成功,但是服务却没启动,脚本如下:
#! /bin/bash
nohup java -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m -jar /usr/local/joshua317-test-core-1.0-SNAPSHOT.jar &
也就是说当通过Jenkins构建完后推送到业务服务器,在执行脚本时,脚本中的 nohup 命令无法正常退出,构建前台任务就卡住了,或者是nohup总是无效。
二、排查
1.在业务服务器上直接执行脚本,可以正常运行,说明脚本的问题不大,但是一旦结合jenkins进行发布,虽然jenkins显示成功,但是shell脚本并没有执行。
2.找一个简单的脚本进行测试
#! /bin/bash
echo "hello" >> /usr/local/test.txt
/usr/local/test.txt中有内容,说明脚本是可以执行成功,同时也说明jenkins在执行带有nohup脚本的时候出现了问题。也就是说构建命令中如果带有 nohup xxx & 触发构建后并构建成功后,虽然但在构建任务的输出中却显示没有问题,也没有任何报错,但是并没有执行shell脚本。
三、原因
jenkins默认会在构建完成后,杀掉构建过程中由shell命令触发的衍生进程。
jenkins根据BUILD_ID识别某个进程是否为构建过程的衍生进程,故修改BUILD_ID后,jenkins就无法识别是否为衍生进程,则此进程能在后台保留运行。
结论就是Jenkins程序只负责运行伪命令行nuhup 命令,并不保证是否成功运行 nuhup后面的命令。
四、解决
(1)使用 BUILD_ID=xxx ,其中xxx可以是任意内容(只要不是原来的BUILD_ID内容即可),同时需要把nohup输出内容重定向到文件里面,如"/usr/local/nohup.out"
#! /bin/bash
BUILD_ID=dontKillMe
nohup java -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m -jar /usr/local/joshua317-test-core-1.0-SNAPSHOT.jar > /usr/local/nohup.out 2>&1 &
##########
上面是查阅的资料,解释的比较详细了,
我自己的配置
pwd
cd /home/crs-dev/.virtualenvs
. qzautotest/bin/activate
pwd
cd /home/crs-dev/.virtualenvs/qzautotest/bin/
pwd
PIDS_MAIN=`ps -ef|grep AutotestFramework/test_run/main.py|grep -v grep|cut -c 9-15`
if [ "$PIDS_MAIN" != "" ]; then
ps -ef|grep AutotestFramework/test_run/main.py|grep -v grep|cut -c 9-15|xargs kill -9
fi
BUILD_ID=dontKillMe
nohup ./python /root/.jenkins/workspace/AutotestFramework/test_run/main.py > /root/.jenkins/workspace/AutotestFramework/test_run/main.out 2>&1 &
PIDS_RUN=`ps -ef|grep AutotestFramework/test_run/run.py|grep -v grep|cut -c 9-15`
if [ "$PIDS_RUN" != "" ]; then
ps -ef|grep AutotestFramework/test_run/run.py|grep -v grep|cut -c 9-15|xargs kill -9
fi
BUILD_ID=dontKillMe
nohup ./python /root/.jenkins/workspace/AutotestFramework/test_run/run.py > /root/.jenkins/workspace/AutotestFramework/test_run/run.out 2>&1 &
技术改变命运