Java教程

jenkins使用shell脚本执行nohup java -jar包失败

本文主要是介绍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 &
这篇关于jenkins使用shell脚本执行nohup java -jar包失败的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!