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终端,导致无法正常启动。
---------是故无冥冥之志者----------
---------无昭昭之明----------
---------无惛惛之事者----------
---------无赫赫之功----------
本文来自博客园,作者:|是吴啊|,转载请注明原文链接:https://www.cnblogs.com/wuguofeng/p/14844076.html