java服务启动时需要启动看门狗脚本定期刷新程序执行状态,以下是一个简单实例:
#!/bin/bash
# 修改APP_NAME为云效上的应用名
APP_NAME=youServerNmae
APP_START_TIMEOUT=120 # 等待应用启动的时间,system启动时间较长
APP_PORT=48103 # 应用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT} # 应用健康检查URL
APP_HOME=/home/admin/application/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下
WATCHDOG_OUT=${APP_HOME}/logs/watchdog.log #应用的启动日志
exec >> $WATCHDOG_OUT 2>&1
echo "watchdog is running!"
while true
do
status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code} ${HEALTH_CHECK_URL}`
if [ "$?" != "0" ]; then
echo -n -e "\rapplication not started"
sh $APP_HOME/deploy.sh start &
else
if [ "$status_code" == "200" ];then
echo "server $APP_NAME is running!"
else
echo "code is $status_code"
sh $APP_HOME/deploy.sh restart &
fi
fi
sleep $APP_START_TIMEOUT # 每隔120秒检测一次
done
1、检测watchdog.sh脚本是否有进程在执行
要检测 watchdog.sh
脚本是否有进程在执行,你可以使用 ps
命令来查找特定进程。下面是一个例子:
ps aux | grep 'watchdog.sh'
这个命令会列出所有包含 watchdog.sh
字符串的进程。如果输出中有匹配的进程,则表示 watchdog.sh
脚本有进程在执行。
另外,你也可以使用 pgrep
命令来检测特定进程是否在执行,例如:
pgrep -f 'watchdog.sh'
这个命令会返回匹配进程的进程ID,如果有匹配的进程则会返回一个非零的退出状态码。
2、开机自动启动看门狗脚本
要实现开机自动启动watchdog.sh
脚本,可以通过修改系统的启动脚本或者使用cron任务来实现。(上述提到的脚本没有开机自启动能力,需要按照一下步骤修改)
-
修改系统启动脚本:
在Linux系统中,你可以将watchdog.sh
脚本添加到系统启动脚本中,以便在系统启动时自动执行。通常情况下,系统启动脚本位于/etc/init.d/
目录下。你可以将watchdog.sh
脚本复制到该目录,并使用update-rc.d
命令添加启动链接,例如:sudo cp watchdog.sh /etc/init.d/ sudo chmod +x /etc/init.d/watchdog.sh sudo update-rc.d watchdog.sh defaults
这样就可以将
watchdog.sh
脚本添加到系统启动中,使其在系统启动时自动执行。 -
使用cron任务:
另一种方法是使用cron任务,在系统启动时自动执行watchdog.sh
脚本。你可以编辑cron任务,添加一个@reboot任务来实现:crontab -e
在打开的编辑器中添加以下行:
@reboot /path/to/watchdog.sh
这将会在系统启动时自动执行
watchdog.sh
脚本。
3.注意
当你多次执行 sh ./watchdog.sh
脚本时,每次执行都会启动一个新的进程,但这些进程是相互独立的,它们不会相互影响。因此,会有多个进程同时执行 watchdog.sh
脚本,而不是单个脚本多次执行。
如果你希望只有一个实例在任何时候执行,你可以在脚本中使用锁文件或者其他机制来确保只有一个实例在运行。另外,你也可以使用类似cron
等工具来确保脚本只会在特定时间点执行一次。
4.部署脚本
部署jar包用的脚本,需要修改JAR_NAME来指定jar包所在目录。然后可以在流水线或者直接在命令行执行sh deploy.sh restart命令即可完成java服务部署,同时也会启动看门狗脚本定时刷新服务状态,如果服务异常终止,看门狗会重新拉起服务
#!/bin/bash
# 修改APP_NAME为云效上的应用名
APP_NAME=statistics-biz
PROG_NAME=$0
ACTION=$1
APP_START_TIMEOUT=120 # 等待应用启动的时间,system启动时间较长
APP_PORT=48103 # 应用端口
HEALTH_CHECK_URL=http://127.0.0.1:${APP_PORT} # 应用健康检查URL
APP_HOME=/home/admin/application/statistics/${APP_NAME} # 从package.tgz中解压出来的jar包放到这个目录下
JAR_NAME=${APP_HOME}/target/${APP_NAME}.jar # jar包的名字
JAVA_OUT=${APP_HOME}/logs/start.log #应用的启动日志
# 创建出相关目录
mkdir -p ${APP_HOME}
mkdir -p ${APP_HOME}/logs
usage() {
echo "Usage: $PROG_NAME {start|stop|restart}"
exit 2
}
health_check() {
exptime=0
echo "checking ${HEALTH_CHECK_URL}"
while true
do
status_code=`/usr/bin/curl -L -o /dev/null --connect-timeout 5 -s -w %{http_code} ${HEALTH_CHECK_URL}`
if [ "$?" != "0" ]; then
echo -n -e "\rapplication not started"
else
echo "code is $status_code"
if [ "$status_code" == "200" ];then
if pgrep -f "watchdog-${APP_NAME}.sh" >/dev/null
then
echo "watchdog-${APP_NAME}.sh脚本有进程在执行"
else
echo "watchdog-${APP_NAME}.sh脚本没有进程在执行"
sh ${APP_HOME}/watchdog-${APP_NAME}.sh &
fi
break
fi
fi
sleep 1
((exptime++))
echo -e "\rWait app to pass health check: $exptime..."
if [ $exptime -gt ${APP_START_TIMEOUT} ]; then
echo 'app start failed'
exit 1
fi
done
echo "check ${HEALTH_CHECK_URL} success"
}
start_application() {
echo "starting java process"
nohup java ${JAVA_PROFILES} -jar ${JAR_NAME} > ${JAVA_OUT} 2>&1 &
echo "started java process"
}
stop_application() {
checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
if [[ ! $checkjavapid ]];then
echo -e "\rno java process"
return
fi
echo "stop java process"
times=60
for e in $(seq 60)
do
sleep 1
COSTTIME=$(($times - $e ))
checkjavapid=`ps -ef | grep java | grep ${APP_NAME} | grep -v grep |grep -v 'deploy.sh'| awk '{print$2}'`
if [[ $checkjavapid ]];then
kill -9 $checkjavapid
echo -e "\r -- stopping java lasts `expr $COSTTIME` seconds."
else
echo -e "\rjava process has exited"
break;
fi
done
echo ""
}
start() {
start_application
health_check
}
stop() {
stop_application
}
case "$ACTION" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
*)
usage
;;
esac