Jenkins构建、发布后台Maven项目时无法后台执行或无法启动的问题(亲测好用)
Jenkins构建、发布后台Maven项目时无法后台执行或无法启动的问题(这个我亲测好使了)export BUILD_ID=dontKillMe(划重点)nohup java -Dhudson.util.ProcessTree.disable=true -jar project.jar &或BUILD_ID=dontKillMe nohup java -Dhudson.util.ProcessTr
使用Jenkins持续集成、管理项目很方便,但是最近在管理后台的Java项目时,发现执行java -jar **** 后构建的job不会停止因为java -jar **** 前台执行了所以就留在了日志位置;
那我就想了,放在后台执行,所以加上了nohup java -jar **** &,使用nohup保证当前用户注销,服务也不会停止,关于Linux后台执行的这里不详细阐述了;
但是这样还是不行因为Jenkins执行shell是Jenkins来将你填写的shell脚本语句在部署的机器上执行,实际上就是Jenkins启动了子进程到部署的机器上执行命令行,所以当最后一行命令执行结束后,Jenkins会杀掉所有在此过程中创建的子进程,如果这里有需要后台运行的,或者挂起的任务时,在Jenkins执行结束后,这些挂起的或后台的任务都会被杀掉,这个问题困扰了我好久,最后整理的几种方案:
在Jenkins的Shell最开始标记#!/bin/bash
可以让您的脚本输出到控制台很干净并且会更清晰的展示命令流程
1、(这个我亲测好使了)
export BUILD_ID=dontKillMe(划重点)
nohup java -Dhudson.util.ProcessTree.disable=true -jar project.jar &
或
BUILD_ID=dontKillMe nohup java -Dhudson.util.ProcessTree.disable=true -jar project.jar &
官方的-Dhudson.util.ProcessTree.disable=true论坛: https://wiki.jenkins.io/display/JENKINS/ProcessTreeKiller
2、只是为了确保启动后台进程的任何命令都将其输出重定向到磁盘文件。
例:$ java -jar project.jar > myLogFile.log 2>&1
然后问题就消失了。(这个不适用于项目已经有定向的日志输出的情况)
3、BUILD_ID = allow_to_run_as_daemon start_my_service
(官方给出的,但是试了一下,我的没好使)
使用以上方法禁止杀后台后,又一个大坑,无论是使用BUILD_ID=dontKillMe或者dontkill,还是-Dhudson.util.ProcessTree.disable=true都会导致该进程无法在jar包删除的时候主动kill掉java进程,所以jar包删除后,进程还在,但是访问不到资源了,所以不好使;然后新的jar包启动时,又会因为老的进程占用端口或服务而无法启动,这样就会导致jenkins管理的项目无法访问、崩溃,所以使用该方式使进程后台不被jenkins杀死时,需要在准备启动新的服务时,使用脚本判断旧进程是否在运行,运行的话就kill掉旧的进程,才可以启动新的进程
查看并杀进程的方法:
old_build_pid=`ps -ef|grep ****你的项目.jar|grep -v grep|awk '{print $2}'`
if [ -n "$old_build_pid" ]; then
echo '上次构建版本进程' $old_build_pid '正在运行,即将中断 kill pid = ' $old_build_pid
kill -9 $old_build_pid
echo '已结束旧的项目进程' $old_build_pid
fi
后面再接正常的发布、启动脚本
可以在jenkins构建的过程中使用ps -aux|grep es-web
查看当前进程状态,不能使用jobs的原因是jobs只能查看当前用户执行的后台进程,其他用户创建的当前用户无法查看,所以使用ps
希望能帮助到大家,祝代码一路畅通
更多推荐
所有评论(0)