当我们发布一个应用时,通常我们要先关闭老的应用,然后更新相关软件包再重启这个应用,在关闭的时候粗暴方式是使用kill -9
杀进程,如果项目中有一些数据需要在程序关闭时进行处理,这种方式就有可能导致数据丢失;温和的方式是使用kill -15
杀进程,但是这种方式也有问题,有可能导致进程关闭失败。所以比较好的方式是先使用kill -15
杀进程等待一段时间,如果在这段时间内进程还在运行就使用kill -9
再杀一次进程,而等待时间的长短就取决于你应用关闭处理时需要的时间,下面是我整理的一个关闭重启应用的脚本:
#!/bin/sh
# 最大等待时间(单位秒),超过这个时间长度将使用kill -9 杀进程
MAX_SECOND=30
# 应用名称
APP_NAME="test-1.0-SNAPSHOT.jar"
JAVA_OPTS=""
echo "====== $APP_NAME ======"
pid=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{ print $2 }')
if [ $pid ]; then
echo "=== begin kill java process, pid is:$pid"
kill -15 $pid
else
echo "=== process $pid not exists or stop success"
fi
stime=$(date +%s)
while true;do
count=`ps -ef|grep $pid|grep -v grep`
if [ "$?" != "0" ];then
echo ">>> $pid is stoped!"
break
else
now=$(date +%s)
diff=$((now - stime))
if [ "$diff" -gt "$MAX_SECOND" ];then
kill -9 $pid
echo ">>> $pid is killed!"
break
fi
echo ">>> $pid is shutting down... $diff s"
fi
sleep 1
done
nohup java $JAVA_OPTS -jar $APP_NAME --spring.profiles.active=test >> ./logs/catalina.out 2>&1 &
sleep 2
spid=$(ps -ef | grep $APP_NAME | grep -v grep | awk '{ print $2 }')
if [ $spid ];then
echo "start success ..."
echo "pid is: $spid"
else
echo "start fail ..."
fi
exit 0