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終端,導致無法正常啟動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM