不积跬步,无以至千里;不积小流,无以成江海。

jenkins 解决服务器远程启动jar方法无响应的方法

部署jenkins远程发布,jenkins在A服务器上,如果链接B服务器并调用B服务器的脚本,启动springboot的jar,会没有响应,先开始的思路是ssh远程连接后启动B服务器脚本,发现没有任何反应,但jenkins内成功,就是jar起不起来,具体“别人的”脚本内容如下:

#!/bin/bash
cd /home/data
echo "Stopping sso"
pid=`ps -ef | grep sso.jar | grep -v grep | awk '{print $2}'`
if [ -n "$pid" ]
then
   echo "kill -9 pid:" $pid
   kill -9 $pid
fi
echo "Execute shell Finish"
BUILD_ID=dontKillMe java -Duser.timezone=GMT+8 -Dspring.profiles.active=test -jar /home/data/sso.jar --httpPort=8886 >/dev/null 2>&1 &

下面这句话这也是别人说的:

一开始看网上有人说在调用的地方用BUILD_ID=dontKillMe,接着又有人说用daemonize守护线程,还有人说改变BUILD_ID值,也有人说在脚本开始前加上JAVA_OPTS="$JAVA_OPTS -Dhudson.util.ProcessTree.disable=true",更有甚者还干脆来了个合集,一个方法都用不了,简直崩溃(网上的大神都是复制粘贴高手,拜服),最后在一篇帖子内看到:

source /etc/profile
 
然后在命令执行的位置添加下面这行命令:
BUILD_ID=dontKillMe
nohup java -jar app.jar > nohup.out & 2>&1 &
注意:source /etc/profile 如果没有,没有错误也不会有java执行的进程
增加 source /etc/profile 后不能直接使用nohup java -jar app.jar & 这时候Jenkins会打印app启动信息,所以需要一个启动程序的脚本!!

没错,就是他,在脚本最前面加上source /etc/profile,完美一切运行正常!!!!!!!!

⬇️⬇️⬇️经过一番整理,下面是我自己在用的,完全没有问题⬇️⬇️⬇️

可以直接看这里(亲测且在用)

一、第一步,编写程序启动脚本。

没错,启动程序需要写一个脚本,脚本路径:/project/jenkins_shell/jenkins_app.sh

#!/bin/bash

export BUILD_ID=dontKillMe

ps -ef | grep app.jar | grep -v grep >/dev/null
if [ $? = 0 ]
then
ps -ef | grep app.jar | grep -v grep |awk '{print $2}'|xargs kill -9
else
echo "没有该进程"
fi

echo "app进程已kill,正在启动。。。"

nohup java  -jar app.jar --spring.profiles.active=prod > app.log 2>&1 &

sleep 2
while test -z "$(netstat -tln | grep :8080)"      #当命令输出 为空,说明还没有端口号,服务还没启动成功
do
        for((i=1;i<=30;i++))
        do
                echo -n "$i "
        if test -z "$(netstat -tln | grep :8080)"
        then
                echo "启动中" >/dev/null
        else
                echo "端口已启动"   #端口已启动说明服务启动成功
                                break;
                fi
        sleep 1
        done
        echo "用时:$i s"
        j=$(($i+1));
        if [ $j -gt 30 ]
        then
            echo "8080-app启动失败,日志:app.log"
                                cat app.log
                                echo "程序启动失败,上一个版本备份在 /jar_bak"
                break;
        else
            echo "------------------app启动成功------------------"
                break;
        fi
done
echo "上一版本已备份,路径:/jar_bak/"

二、Jenkins配置shelll

当然,因为我这里是从一台有外网的服务器安装的jenkins,然后需要把代码jar包传到内网服务器192.168.0.1上。(在此之前,需要配置外网服务器到内网服务器的免密登录)
配置免密登录 ➡️ https://www.cnblogs.com/wuguofeng/p/14926913.html

mvn clean package -Dmaven.test.skip=true
ssh root@192.168.0.1 'cp app.jar /jar_bak/'
scp -r /jenkins/workspace/app/app/target/app.jar root@192.168.0.1:/project/
ssh root@192.168.0.1 "source /etc/profile;su 普通用户 -c 'bash /project/jenkins_shell/jenkins_app.sh'"

原来在一台服务器远程链接另一台服务器的时候,即便是存在BUILD_ID=dontKillMe,必须使用source /etc/profile,使其在B终端内有效,不然默认还是A终端,导致无法正常启动。

posted @ 2021-06-03 10:10  |是吴啊|  阅读(1171)  评论(0编辑  收藏  举报