先貼一下挠唆,我的jenkins里最后核心配置
#停止服務(wù)审轮,備份jar
ssh -p 22 root@0.0.0.0 'bash -s ' < /opt/auto-deploy-scripts/remove_jar.sh /opt/jar/ alk-wxapi-test.jar
#copy jar
scp -P22 /mnt/jenkins/workspace/alk_api_test_auto_deploy/target/uberjar/alk-wxapi-test.jar root@0.0.0.0:/opt/jar/
#重啟服務(wù)
ssh -p 22 root@0.0.0.0 'bash -s' < /opt/auto-deploy-scripts/start_jar.sh /usr/local/jdk1.8.0_212 /opt/jar/ alk-wxapi-test.jar
remove_jar.sh腳本:
#!/bin/bash
#獲取第一個參數(shù),jar包路徑,先備份,再發(fā)布
jar_path=$1
#!編譯好的jar包名稱
jar_name=$2
file=$jar_path$jar_name
bak_file=`date +%Y%m%d%H%M%S`.$jar_name
bak_path="bak/"
if [ $jar_name == "" ] ;then
echo " jar name is null"
exit 5
else
echo "================== service stop start======================="
pid=`ps -aux | grep $jar_name | grep -v bash |grep -v grep | awk '{print $2}'`
if [ -n "${pid}" ]
then
#!kill -9 強(qiáng)制終止
echo "kill -9 的pid:" $pid
kill -9 $pid
fi
echo "================== service stop end ======================="
echo "service stop successed!"
echo "================== jar backup start ======================="
#!將現(xiàn)有的jar備份后,將新的jar包替換
cd $jar_path
echo "file origin is: $file"
echo "backup jar is: $jar_path$bak_path"
if [ -f "$file" ]
then
rm -rf $jar_path$bak_path/*
mv $jar_name $bak_file
cp $bak_file $jar_path$bak_path
rm -rf $bak_file
fi
echo "================== jar backup end ======================="
fi
start_jar.sh腳本內(nèi)容:
#!啟動應(yīng)用
#!stop.sh
#!/bin/bash
echo "================== startup start ======================="
#獲取第1個參數(shù)猾担,jdk的安裝路徑
jdk_path=$1
#獲取第2個參數(shù),jar包路徑,先備份,再發(fā)布
jar_path=$2
#第三個參數(shù),編譯好的jar包名稱
jar_name=$3
file=$jar_path$jar_name
#遠(yuǎn)程執(zhí)行該腳本時改變了環(huán)境變量讶凉,找不到j(luò)ava的環(huán)境變量辙谜,提示:nohup: failed to run command ‘java’: No such file or directory
#所以需要加上以下java的環(huán)境變量,其中JAVA_HOME的值肝匆,可以通過執(zhí)行命令echo $JAVA_HOME得到粒蜈,每個人的java環(huán)境變量設(shè)置不一樣
#該問題參考自:https://stackoverflow.com/questions/20791846/zookeeper-not-starting-nohup-error
export JAVA_HOME=${jdk_path}
export PATH=$JAVA_HOME/bin:$PATH
echo "授予當(dāng)前用戶權(quán)限"
#chmod 777 $file
echo "執(zhí)行....."
cd $jar_path
nohup java -jar $file > ${jar_path}/log/nohup.log 2>&1 &
echo "啟動jar的命令: nohup java -jar $file > ${jar_path}log/nohup.log 2>&1 & "
echo "================== startup end ======================="
remove_jar.sh
和start_jar.sh
在jenkins服務(wù)器上,需要將這兩個shell在0.0.0.0(不能暴露)的遠(yuǎn)端去執(zhí)行
沒錯旗国,客官您一眼就看出來了枯怖,覺得簡單的不值一提吧,先別著急能曾,對搜這個問題的小菜雞來說這里面也是大有文章度硝,聽我一一道來肿轨。
1、第一個問題:ps -ef|grep xxx.jar查到多余的pid
現(xiàn)象:在0.0.0.0上行ps -ef | grep alk-wxapi-test.jar | grep -v grep | awk '{print $2}'
只能查到一個pid蕊程,但是把這句話放到shell腳本里椒袍,在本地使用命令上遠(yuǎn)端執(zhí)行,就會找到3個pid藻茂,而且kill 時提示失敗的錯誤驹暑。
現(xiàn)在已經(jīng)知道原因了,但是當(dāng)時確實(shí)是個問題辨赐。
已經(jīng)解決不方便復(fù)現(xiàn)了优俘,因此就描述一下就行了。
原因:shell里的這個命令也是通過bash在遠(yuǎn)程執(zhí)行的肖油,所以找到的別的無關(guān)緊要的pid其實(shí)是bash兼吓,因此在grep是除了排除grep本身(grep -v grep
)外還要排除bash(grep -v bash
)
最后命令是:
pid=`ps -aux | grep $jar_name | grep -v bash |grep -v grep | awk '{print $2}'`
2、遠(yuǎn)程執(zhí)行腳本森枪,里面有nohup java -jar,發(fā)生錯誤:nohup: failed to run command ‘java’: No such file or directory
這是因?yàn)閚ohup時java環(huán)境變量沒有讀到视搏,處理方式就是在nohup執(zhí)行前加入
export JAVA_HOME=/usr/local/java/jdk1.8.0_151
export PATH=$JAVA_HOME/bin:$PATH
3、其他思路
- 將jar的服務(wù)配置成服務(wù)器的一個service县袱,使用systemctl停止浑娜、啟動等。
- 使用docker部署服務(wù)式散。
2019-12-11 補(bǔ)充
4筋遭、第二條說jdk的路徑因?yàn)槊總€服務(wù)企業(yè)都不一樣,所以需要手動傳改暴拄,這一點(diǎn)已經(jīng)在腳本上做了修改漓滔,啟動腳本上攜帶的第一個參數(shù)就是jdk的安裝路徑
這兩個也都是比較好的思路,以后肯定有機(jī)會體驗(yàn)的乖篷,本篇到此响驴。
參考:
ps -ef |grep -v 在shell sh 腳本中貌似無效?
linux下搭建zookeeper集群遇到的坑
nohup: cannot run command異常解決
Zookeeper not starting, nohup error