watchdog.sh看门狗脚本

本文详细介绍了如何编写和配置一个Java服务的看门狗脚本,包括检测脚本运行状态、开机自动启动、使用curl进行健康检查以及部署和重启服务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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任务来实现。(上述提到的脚本没有开机自启动能力,需要按照一下步骤修改)

  1. 修改系统启动脚本:
    在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脚本添加到系统启动中,使其在系统启动时自动执行。

  2. 使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值