一个通用的Spring Boot启停脚本
#!/bin/bash
app_name='study-0.0.1-SNAPSHOT.jar'
log_file=${app_name%.*}.log
log_file_back="${log_file%.*}_$(date +%Y%m%d_%H%M%S).log"
pid=`ps -ef | grep $app_name | grep -v grep | awk '{print $2}' | head -n 1`
# 计数器
count=0
# 停止进程等待时间:秒
kill_wait_seconds=45
# 是否成功停止进程的标志
kill_success='null'
# 启动等待时间:秒
start_wait_seconds=45
if [ -n "${pid}" ]; then
kill_success='true'
fi
# 结束旧进程。
# 使用kill -15结束Spring Boot进程时(优雅停机),默认情况下,若服务超过30s还未结束,则会被强制停机(效果类似于kill -9)
# 若要Spring Boot强制优雅停机,可在配置文件配置server.shutdown=GRACEFUL,还可以配置spring.lifecycle.timeout-per-shutdown-phase=30s指定超时时长
while [ -n "${pid}" ]
do
if [ $count -eq 0 ]; then
echo "start kill ***${app_name}*** by pid ${pid}"
kill -15 $pid
echo -n 'killing'
fi
if [ $count -ge $kill_wait_seconds ]; then
echo ''
echo "Kill fail. Please check detail or use \"kill -9 ${pid}\""
kill_success='false'
break
fi
sleep 1
echo -n '.'
pid=`ps -ef | grep $app_name | grep -v grep | awk '{print $2}' | head -n 1`
count=$((count + 1))
done
if [ $kill_success == 'true' ]; then
echo ''
echo "***${app_name}*** kill successed!"
fi
if [ $kill_success != 'false' ]; then
if [ -f "$log_file" ]; then
echo "Backing up existing log: ${log_file} -> ${log_file_back}"
mv "$log_file" "$log_file_back"
fi
# 核心启动命令,在此处添加启动参数等
nohup java -jar $app_name > ${log_file} 2>&1 &
# 启动命令执行成功,开始监控日志文件
echo -n "starting"
count=0
while [ $count -lt $start_wait_seconds ]
do
sleep 1
echo -n '.'
if grep -q "Started .* in .* seconds" "${log_file}"; then
break
fi
count=$((count + 1))
done
echo ''
if grep -q "Started .* in .* seconds" "${log_file}"; then
echo "***${app_name}*** start successed!"
else
echo "***${app_name}*** startup time out. No success flag found in ${log_file}."
fi
fi
3万+



被折叠的 条评论
为什么被折叠?



