一、背景
在开发中,经常需要在开发服务器上部署JAR包,重复性的需要完成查进程ID,kill进程,执行命令启动,查看日期是否启动成功等操作,本着不做重复工作的原则,通过sh脚本实现这些操作,在部署时执行执行一下sh脚本就好。
二、思路
1、通过命令查询进程ID
方式①,通过Jar名称查询
pid=($(ps -ef|grep xxx.jar|awk '{print $2}'))
方式②,通过端口号查询
port='8080'
pid_str=($(netstat -ltnp|grep :$port | awk '{print $7}'))
pid=${pid_str///java/}
建议用方式②,应为方式①可能存在相同jar名称的多个进程,如此无法区分;但是通过端口号查询进程ID一定是唯一准确的。
2、 通过命令结束运行中应用
#判断并停止服务
length=${#pid[@]}
if [ $length -gt 0 ] ;then
kill -9 $pid
echo "服务已停止"
fi
3、 重新启动应用
#这样命令启动,日志按照logback配置的输出
nohup java -jar xxx.jar >/dev/null 2>&1 &
4、 通过日志检查是否启动完成
1、通过搜索日志中启动完成的标志字符串判断是否完成启动
2、标志字符串比如:Started MySpringBootApplication,根据项目不同设定
3、设置最长等待时间,睡眠每2秒检测一次是否启动完成
#启动过程等待完成
today=($(date --date today +%Y-%m-%d))
#echo "今日:$tody"
log_file_path="xxx/logs/info-${today}.log"
fun_echo_yellow "服务今日日志文件:$log_file_path"
#保存当前已有日志文件
if [ -f $log_file_path ]
then
log_file_path_backup="xxx/logs/info-${today}_backup_$(date +'%H时%M分%S秒').log"
fun_echo_yellow "服务今日日志文件 备份:$log_file_path_backup"
cp $log_file_path $log_file_path_backup
fi
#清空当前日志文件内容
echo "" > $log_file_path
##清空错误日志文件内容
error_file_path="xxx/logs/error-${today}.log"
echo "" > $error_file_path
#睡眠总时长
sleep_seconds=2
sleep 2
startFlagLine=($(grep "$start_complete_flag" $log_file_path | awk '{print $10 $11}'))
while([ -z "Started MySpringBootApplication" ])
do
fun_echo_g_white "启动中... 耗时: ${sleep_seconds}秒"
startFlagLine=($(grep "$start_complete_flag" $log_file_path | awk '{print $10 $11}'))
if [ $sleep_seconds -gt $waiting_max_seconds ];then
break
fi
sleep 2
sleep_seconds=$(expr $sleep_seconds + 2)
done
if [ $sleep_seconds -gt $waiting_max_seconds ];then
fun_echo_red "耗时太久,未找到启动完成标志,请看看日志"
else
fun_echo_green "部署完成"
fi
fun_echo_yellow "**************************************** 部署结束。。。 "
三、写好一个部署的脚本deploy.sh
#!/bin/bash
#公共变量定义
#jar名称
jar_name="xxx.jar"
#项目基础路径
project_base_dir="/xxx/xxx/"
#等待最长时间
waiting_max_seconds=60;
#日志中启动完成标志字符串
start_complete_flag="Started MySpringBootApplication"
#程序占用端口
port="18801"
#定义函数
################################### 定义函数 start #################################
#控制台输出 - (默认)
function fun_echo(){
echo $1
}
#控制台输出 - 红色字 - (错误)
function fun_echo_red(){
echo -e "\033[31m $1 \033[0m"
}
#控制台输出 - 绿色字 - (成功)
function fun_echo_green(){
echo -e "\033[32m $1 \033[0m"
}
#控制台输出 - 黄色字 - (警告)
function fun_echo_yellow(){
echo -e "\033[33m $1 \033[0m"
}
#控制台输出 - 绿底白字 - (警告)
function fun_echo_g_white(){
echo -e "\033[47;42m $1 \033[0m"
}
################################### 定义函数 end #################################
echo "部署服务$jar_name..."
fun_echo_yellow "**************************************** 开始部署。。。 "
echo "第一步、停止服务"
#查找正确运行中的服务pid
platform=($(netstat -ltnp|grep :$port | awk '{print $7}'))
platform=${platform///java/}
echo "程序ID:$platform"
#判断并停止服务
length=${#platform[@]}
if [ $length -gt 0 ] ;then
kill -9 $platform
echo "服务已停止"
fi
echo "第二步、启动服务"
cd $project_base_dir/jar/
#nohup java -jar ldapsso-back-test.jar &>log.txt &
#这样命令启动,日志文件按照logback配置的输出
nohup java -jar $jar_name >/dev/null 2>&1 &
#启动过程等待完成
today=($(date --date today +%Y-%m-%d))
#echo "今日:$tody"
log_file_path="$project_base_dir/logs/info-${today}.log"
fun_echo_yellow "服务今日日志文件:$log_file_path"
#保存当前已有日志文件
if [ -f $log_file_path ]
then
log_file_path_backup="$project_base_dir/logs/info-${today}_backup_$(date +'%H时%M分%S秒').log"
fun_echo_yellow "服务今日日志文件 备份:$log_file_path_backup"
cp $log_file_path $log_file_path_backup
fi
#清空当前日志文件内容
echo "" > $log_file_path
##清空错误日志文件内容
error_file_path="$project_base_dir/logs/error-${today}.log"
echo "" > $error_file_path
#睡眠总时长
sleep_seconds=2
sleep 2
startFlagLine=($(grep "$start_complete_flag" $log_file_path | awk '{print $10 $11}'))
while([ -z "$startFlagLine" ])
do
fun_echo_g_white "启动中... 耗时: ${sleep_seconds}秒"
startFlagLine=($(grep "$start_complete_flag" $log_file_path | awk '{print $10 $11}'))
if [ $sleep_seconds -gt $waiting_max_seconds ];then
break
fi
sleep 2
sleep_seconds=$(expr $sleep_seconds + 2)
done
if [ $sleep_seconds -gt $waiting_max_seconds ];then
fun_echo_red "耗时太久,未找到启动完成标志,请看看日志"
else
fun_echo_green "部署完成"
fi
fun_echo_yellow "**************************************** 部署结束。。。 "
四、部署执行deploy.sh展示
[root@app jar]# ./deploy.sh
部署服务xxx.jar...
**************************************** 开始部署。。。
第一步、停止服务
程序ID:8221
服务已停止
第二步、启动服务
服务今日日志文件:/xxx/xxx/logs/info-2023-03-24.log
服务今日日志文件 备份:/xxx/xxx/logs/info-2023-03-24_backup_11时38分25秒.log
启动中... 耗时: 2秒
启动中... 耗时: 4秒
启动中... 耗时: 6秒
启动中... 耗时: 8秒
启动中... 耗时: 10秒
启动中... 耗时: 12秒
启动中... 耗时: 14秒
启动中... 耗时: 16秒
启动中... 耗时: 18秒
启动中... 耗时: 20秒
启动中... 耗时: 22秒
启动中... 耗时: 24秒
部署完成
**************************************** 部署结束。。。
[root@app jar]#