Jenkins杀掉后台进程问题
使用Jenkins部署后台进程,被kill掉解决
Jenkins远程部署启动shell 文件时无法启动程序,但是jenkins 没有报错,Jenkins显示后台启动正常

原因分析,网上说的我觉得都对,就是jenkins会杀后台以及衍生的程序,这里我用了很多网上的方法,实现启动的程序功能的我有两种,一种是同事写的,一种是我自己捣鼓出来的,这两种解决方案都提供给大家。
先写网上的各种解决方案,看到最多的就是下面这

export BUILD_ID=dontKillMe

这种方式我试了很多地方试了,貌似没用 比如 shell 脚本里,比如 Exec command 里面添加这个 ,但是都会在jenkins 日志里面找到这个命令,貌似没起作用;
好友就是说在shell 脚本中加这个命令

source /etc/profile

或者

export source /etc/profile

这个命令我也试了,但是在我这里还是没起作用,还是jenkins 执行了脚本但是确kill 掉了后台。
解决方案如下两种
第一种在shell 脚本中再启动shell脚本,
代码如下:

port=8089
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }')
echo $pid
if [ -n "$pid" ]
then
   #!kill -9 强制终止
   echo "kill google-0.0.1-SNAPSHOT.jar -9 pid:" $pid
   kill -9 $pid
fi
if [ "$1" = "stop" ]
then
   echo "Stopping google-0.0.1-SNAPSHOT.jar"
else
   	echo "Running SpringBoot Application for google-0.0.1-SNAPSHOT.jar"
	OLD_BUILD_ID=$BUILD_ID
	echo $OLD_BUILD_ID
	BUILD_ID=dontKillMe
	cd /usr/local/vuetest
	sh start.sh
	BUILD_ID=$OLD_BUILD_ID
	echo $BUILD_ID
	echo "==== upgrade google-0.0.1-SNAPSHOT.jar success !!! ===="
fi

解释下我的代码:
port 是我Linux服务器上的端口
pid 是这个端口的进程,后面就是kill 掉这个端口的进程,然后启动我服务器上的shell 脚本,这个需要根据指令来判断是否启动脚本
sh start.sh 是启动我服务器上的另外一个脚本,关键估计就是这一步,因为我的实际的Java -jar XXX 的命令是在start.sh 里面的。
贴下start.sh 的内容

OLD_BUILD_ID=$BUILD_ID
echo $OLD_BUILD_ID
BUILD_ID=dontKillMe
nohup java -jar google-0.0.1-SNAPSHOT.jar >> nohup.out 2>&1 &
BUILD_ID=$OLD_BUILD_ID
echo $BUILD_ID
echo "==== upgrade google-0.0.1-SNAPSHOT.jar success !!! ===="

主要的就 那行 nohup 的命令,所有的这些就是在包户这行命令
我的解决思路就是,在远程服务器的脚本里面调用远程服务器的其他脚本,目前测试是可行的。
再就是我执行成功过的第二种方法了,脚本如下:

##!/bin/sh
export JAVA_HOME=/usr/local/jdk1.8.0_181
export JRE=/usr/local/jdk1.8.0_181/jre 
export CLASSPATH=$JAVA_HOME/lib:$JRE/lib:. 
export PATH=$PATH:$JAVA_HOME/bin/:$JRE/bin

baseDirForScriptSelf=/usr/local/vuetest
echo "full path to currently executed script is : ${baseDirForScriptSelf}"
cd ${baseDirForScriptSelf}

file="google"

echo "Stopping SpringBoot Application for ${file}"
ls
port=8089
pid=$(netstat -nlp | grep :$port | awk '{print $7}' | awk -F"/" '{ print $1 }');
if [ -n "$pid" ]
then
   #!kill -9 强制终止
   echo "kill ${file}.jar -9 pid:" $pid
   kill -9 $pid
fi

if [ "$1" = "stop" ]
then
   echo "Stopping ${file}"
else
   # 运行升级后应用
   echo "Running SpringBoot Application for ${file}"
   nohup java -Xms512m -Xmx512m -jar ${file}.jar > ${file}.out 2>&1 &
   echo "==== upgrade ${file} success !!! ===="
fi

这个方法的关键估计是前面的那四个 export命令 ,引入的是远程服务器上的一环境,网上有人是这么做的,但是我的问题是,我的服务器的Linux自带Java 环境,我怎么都找不到那几个环境变量,因为我的/etc/profile 里面的Java环境是‘假的地址’ 软链接地址,我又不想重新安装Java 环境所以就没有用这个方法。
我的两个启动远程服务的方法我觉得各有优点,第一个就是不用配那些环境,但是需要两个shell 脚本,第二个就是直接启动,但是需要自己在/etc/profile里找环境,需要对机器很熟悉。
后面我就试试不在我的shell 脚本中加BUILD_ID=dontKillMe 看能不能正常的通过jenkins远程启动

当然,还有通过修改jenkins 的配置的方法可以用,目前我没有修改jenkins 的默认配置,毕竟我觉得jenkins的这个kill 衍生进程的设定还是挺好的。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐