Jenkins中通过execute shell无法启动进程-解决方案合集
作者:佚名 发表时间:2018-11-18 14:43:11
转自: https://blog.csdn.net/u011781521/article/details/80210985

一、问题描述


jenkins使用publish over ssh,执行shell,没报错,日志输出成功


		
  1. 23:43:13 SSH: EXEC: completed after 10,225 ms
  2. 23:43:13 SSH: Disconnecting configuration [swarm2] ...
  3. 23:43:13 SSH: Transferred 1 file(s)
  4. 23:43:13 Finished: SUCCESS
但问题就是,在服务器上,该进程没有运行。。很尴尬。在jenkins上发现了问题所在



这是因为Jenkins默认会在Build结束后Kill掉所有的衍生进程。


二、解决方法

1.重设环境变量build_id

方式一:(会出现timed out or was interrupted after 120,001 ms连接超时):


		
  1. BUILD_ID=dontKillMe
  2. sh /home/cloud/exec/test.sh

脚本内容为:


		
  1. echo "执行.........................."
  2. java -jar /home/cloud/run/spring-boot-0.0.1-SNAPSHOT.jar

方法二:
sh /home/cloud/exec/test.sh
		

脚本内容为:


		
  1. export BUILD_ID=dontKillMe
  2. nohup java -jar /home/cloud/run/spring-boot-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
  3. #奇怪如果去掉以下延时,就会被jenkins杀掉.尴尬。。。
  4. sleep 10s

方式三:

通过daemonize方式来免杀

(1)test.sh脚本中不行

		
  1. daemonize -E BUILD_ID=dontKillMe nohup java -jar /home/cloud/run/spring-boot-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
  2. sleep 10s


(2)test.sh脚本中不行
daemonize -E BUILD_ID=dontKillMe -o test.log -c /home/cloud/run  /home/cloud/run/spring-boot-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 & 
		


(3)execute shell输入框中不行
daemonize -E BUILD_ID=dontKillMe -o test.log -c /home/cloud/run  /home/cloud/exec/test.sh 
		


2.临时改变BUILD_ID值,使得jenkins不会找到并结束掉run.sh启动的后台进程


		
  1. OLD_BUILD_ID=$BUILD_ID
  2. echo $OLD_BUILD_ID
  3. BUILD_ID=dontKillMe
  4. sh /home/cloud/exec/test.sh
  5. #改回原来的BUILD_ID值
  6. BUILD_ID=$OLD_BUILD_ID
  7. echo $BUILD_ID
test.sh内容如下:

		
  1. echo "执行.........................."
  2. nohup java -jar /home/cloud/run/spring-boot-0.0.1-SNAPSHOT.jar >/dev/null 2>&1 &
  3. #奇怪如果去掉以下延时,就会被jenkins杀掉.尴尬。。。
  4. sleep 10s

3.通过Jenkins提供的启动参数禁用杀死子进程的特性


3.1使用java -jar启动,-Dhudson.util.ProcessTree.disable=true -jar jenkins.war
3.2使用Tomcat启动,Linux系统修改catalina.sh,在环境变量的说明后,脚本开始前加上JAVA_OPTS="$JAVA_OPTS -Dhudson.util.ProcessTree.disable=true";Windows系统修改catalina.bat,在环境变量的说明后,脚本开始前加上set JAVA_OPTS=%JAVA_OPTS% "-Dhudson.util.ProcessTree.disable=true";修改好Tomcat的配置文件后重新启动Tomcat



坑:
由于jenkins构建完毕后会杀掉所有启动的进程,可以通过改变BUILD_ID的值来防止后台进程被杀死

如果采用maven工程进行构建,修改BUILD_ID无效,后台进程随着jenkins构建完成后仍被杀死


参考:

https://blog.csdn.net/wangbin0016/article/details/41948171

https://blog.csdn.net/houyefeng/article/details/52269366

https://www.jianshu.com/p/a7d7df97fe4b

https://blog.csdn.net/zhangpan_soft/article/details/79575981

阅读更多