定时任务查询项目健康状态

281 阅读1分钟

项目启动脚本

#!/bin/sh 
AppName=job.jar #替换为自己项目jar包
# JVM参数
JVM_OPTS="-Dname=$AppName -Duser.timezone=Asia/Shanghai -Xms512m -Xmx512m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -XX:+HeapDumpOnOutOfMemoryError -XX:+PrintGCDateStamps -XX:+PrintGCDetails -XX:NewRatio=1 -XX:SurvivorRatio=30 -XX:+UseParallelGC -XX:+UseParallelOldGC"
APP_HOME=`pwd`
#LOG_PATH=$APP_HOME/logs/$AppName.log 
#DLOADER_PATH="-Dloader.path="$APP_HOME/lib
if [ "$1" = "" ];
then
    echo -e "\033[0;31m 未输入操作名 \033[0m \033[0;34m {start|stop|restart|status} \033[0m"
    exit 1
 fi
 
 if [ "$AppName" = "" ];
 then
     echo -e "\033[0;31m 未输入应用名 \033[0m"
     exit 1
 fi
 
 function start()
 { 
     PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` 
     if [ x"$PID" != x"" ]; 
         then echo "$AppName is running..." 
     else 
         nohup java $JVM_OPTS -jar $AppName > /dev/null 2>&1 & echo "Start $AppName success..." 
     fi 
 }
 
function stop() { 
   echo "Stop $AppName" 
   PID="" 
        query(){ 
            PID=`ps -ef |grep java|grep $AppName|grep -v grep|awk '{print $2}'` 
        } query if [ x"$PID" != x"" ]; 
        then kill -TERM $PID echo "$AppName (pid:$PID) exiting..." 
        while [ x"$PID" != x"" ] do sleep 1 
            query done echo "$AppName exited." 
        else echo "$AppName already stopped."
  fi 
}

function restart() { 
    stop 
    sleep 2 
    start 
}

function status() { 
    PID=`ps -ef |grep java|grep $AppName|grep -v grep|wc -l` 
    if [ $PID != 0 ];then 
        echo "$AppName is running..." 
    else 
        echo "$AppName is not running..." 
    fi 
}

case $1 in start) 
    start;; 
    stop) 
    stop;; 
    restart) 
    restart;; 
    status) 
    status;; 
    *) 
esac

将脚本保存为 job.sh,并赋予可执行权限:chmod +x job.sh

健康检测脚本(多项目)

``

#!/bin/bash 

# 定义变量 
APP_HOME="/opt/data/job" # 应用程序目录 
LOG_DIR="/opt/data/job/logs" # 日志目录 
JAR_FILES=("job" "mall-system") # 要监控的 JAR 文件列表 

# 获取当前时间戳 
TIMESTAMP=$(date "+%Y-%m-%d %H:%M:%S") 

echo "[$TIMESTAMP] 开始健康检查。" >> $LOG_DIR/healthcheck.log 

# 检查并启动 JAR 文件 
function check_and_start() { 
    local jar_name=$1 
    local script_name="$jar_name.sh" # 获取对应的启动脚本名称 
    local pid=$(pgrep -f $jar_name) 
    
    if [ -z "$pid" ]; then 
        # 如果未找到进程,则调用启动脚本启动应用 
        echo "[$TIMESTAMP] $jar_name 未找到进程,调用启动脚本启动应用 $script_name..." >> $LOG_DIR/healthcheck.log 
        bash $APP_HOME/$script_name start 
        echo "[$TIMESTAMP] $jar_name restarted using $script_name." >> $LOG_DIR/healthcheck.log 
    else 
        # 如果应用正在运行,则记录状态 
        echo "[$TIMESTAMP] $jar_name 正在运行 (PID: $pid)." >> $LOG_DIR/healthcheck.log 
    fi 
} 
# 主逻辑:遍历所有 JAR 文件并检查 
for jar in "${JAR_FILES[@]}"; do 
    check_and_start $jar 
done 

# 输出完成信息 
echo "[$TIMESTAMP] 健康检查完成。" >> $LOG_DIR/healthcheck.log

测试脚本

  1. 将脚本保存为 healthcheck.sh,并赋予可执行权限:chmod +x healthcheck.sh
  2. 手动运行脚本测试 ./healthcheck.sh
  3. 检查日志文件,确认脚本是否正常工作 tail -f /path/to/your/logs/healthcheck.log

注意事项

1. 权限问题

  • 确保脚本有权限访问 APP_HOME 和 LOG_DIR。
  • 如果使用 cron 执行脚本,请确保 Cron 环境中有正确的路径和权限。

2. 启动脚本路径

  • 确保每个 JAR 文件的启动脚本位于 $APP_HOME 目录下,并且具有可执行权限。

3. 错误处理

  • 如果启动脚本执行失败,可以在健康检查脚本中增加重试机制或发送告警通知。

4. 扩展性

  • 如果需要监控更多 JAR 文件,只需在 JAR_FILES 数组中添加新的文件名即可。

定时任务

1. 确保 Cron 服务已启用并开机自启

检查 Cron 服务状态

使用以下命令检查 cron 或 crond 服务是否正在运行:

systemctl status cron # Debian/Ubuntu 系统 
systemctl status crond # CentOS/RHEL 系统

如果服务未运行,可以启动它:

systemctl start cron # Debian/Ubuntu 系统 
systemctl start crond # CentOS/RHEL 系统

设置开机自启

确保 cron 或 crond 服务在系统重启后自动启动:

systemctl enable cron # Debian/Ubuntu 系统 
systemctl enable crond # CentOS/RHEL 系统

2. 配置定时任务

编辑用户的 Crontab 文件

使用 crontab -e 命令编辑当前用户的定时任务列表。

crontab -e

添加定时任务

假设你需要每 5 分钟运行一次健康检查脚本 healthcheck.sh,可以添加如下内容:

*/5 * * * * /bin/bash /path/to/your/script/healthcheck.sh >> /path/to/your/logs/cron.log 2>&1

注意事项

  • 确保脚本路径是绝对路径。
  • 如果脚本依赖某些环境变量,请在 Crontab 中显式设置这些变量。例如:
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin JAVA_HOME=/usr/lib/jvm/java-11
  • 使用 >> 将输出重定向到日志文件,便于后续排查问题。

3. 防止定时任务因权限问题无法执行

检查文件权限

确保脚本文件具有可执行权限:

chmod +x /path/to/your/script/healthcheck.sh

检查 Crontab 文件权限

Crontab 文件的权限应为只读,避免被其他用户修改:

ls -l /var/spool/cron/crontabs/

如果权限不正确,可以修复:

sudo chmod 600 /var/spool/cron/crontabs/$(whoami)