问题:jenkins构建完代码通过Publish Vver SSH推送到业务机器执行.sh脚本时,脚本中的nohup不正常退出,而且nohup日志越积越大,jenkins控制栏一直处于超时状态,不能结束。

最后会贴出.sh脚本。

查了很多资料也没有解决,汇总下吧,防止再次踩坑,最后会贴出最终解决方案:

1、有人说要在Exec command 区添加source /etc/profile,但是光添加这个是不能解决最终问题的,加上它是可以让.sh脚本执行,但是jenkins构建日志还是一直转圈圈。

2、有人说在execute shell输入框中加入BUILD_ID=DONTKILLME,即可防止jenkins杀死启动的进程。jenkins日志依然转圈圈。

3、有人说要在nohup执行最后放&符结束,这不是瞎扯淡么。

4、有人说在/etc/sysconfig/jenkins中加入参数-Dhudson.util.ProcessTree.disable=true,但是我的是windows服务,直接忽略。

在找了很久的解决方案后,在一个老哥的博客上发现了新的解决方法,亲测有效。

地址:https://www.cnblogs.com/daysn/p/11150734.html

我本人设置的参数:

linux机器上执行脚本:

#!/bin/bash
#java options
APP_MAINCLASS=com.data.center.gateway.DataGatewayApplication
JAR_NAME=data-gateway.jar
# 日志路径,加不加引号都行。 注意:等号两边 不能 有空格,否则会提示command找不到
LOG_PATh=/cjhx/appsoft/jar/data-gateway/nohup.out

#Xms inin memery
#Xmx max memery
#Xmn young memery
JAVA_OPTS="-Xms512m -Xmx512m -XX:CompressedClassSpaceSize=128m -XX:MetaspaceSize=200m -XX:MaxMetaspaceSize=200m -Xloggc:logs/gc.log"

# 启动方法
start() {
        # 重新获取一下pid,因为其它操作如stop会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行
	if [ -z $pid ]; then
        nohup java -jar $JAR_NAME $JAVA_OPTS /dev/null 2>&1 &
        pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
		echo ""
        echo "Service ${JAR_NAME} is starting!pid=${pid}"
		echo "........................Here is the log.............................."
		echo "....................................................................."
        # tail -f $LOG_PATh
		echo "........................Start successfully!........................."
	else
		echo ""
		echo "Service ${JAR_NAME} is already running,it's pid = ${pid}. If necessary, please use command: sh auto_deploy.sh restart."
		echo ""
	fi
}

# 停止方法
stop() {
		# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
	if [ -z $pid ]; then
		echo ""
        echo "Service ${JAR_NAME} is not running! It's not necessary to stop it!"
		echo ""
	else
		kill -9 $pid
		echo ""
		echo "Service stop successfully!pid:${pid} which has been killed forcibly!"
		echo ""
	fi
}

# 输出运行状态方法
status() {
        # 重新获取一下pid,因为其它操作如stop、restart、start等会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行。注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
	if [ -z $pid ];then
		echo ""
        echo "Service ${JAR_NAME} is not running!"
		echo ""
	else
		echo ""
        echo "Service ${JAR_NAME} is running. It's pid=${pid}"
		echo ""
	fi
}

# 重启方法
restart() {
	echo ""
	echo ".............................Restarting.............................."
	echo "....................................................................."
		# 重新获取一下pid,因为其它操作如start会导致pid的状态更新
	pid=`ps -ef | grep $JAR_NAME | grep -v grep | awk '{print $2}'`
        # -z 表示如果$pid为空时执行。 注意:每个命令和变量之间一定要前后加空格,否则会提示command找不到
	if [ ! -z $pid ]; then
		kill -9 $pid
	fi
	start
	echo "....................Restart successfully!..........................."
}

info() {
   echo "System Information:"
   echo "****************************"
   echo `head -n 1 /etc/issue`
   echo `uname -a`
   echo "****************************"
   echo "JAVA_HOME=$JAVA_HOME"
   echo `$JAVA_HOME/bin/java -version`
   echo "****************************"
   echo "APP_MAINCLASS=$APP_MAINCLASS"
   echo "****************************"
}

if [ ! -n "$1" ] ;then
 echo "Usage: $0 {start|stop|restart|status|info}"
elif [ $1 = "start" ];then
 start
elif [ $1 = "stop" ];then
 stop
elif [ $1 = "restart" ];then
 restart
elif [ $1 = "status" ];then
 status
elif [ $1 = "info" ];then
 info
fi

构建后完美解决。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐