如何获取运行中cronjob的持续时长并监控长时间运行的cronjob?
监控运行中CronJob的持续时长及告警方案
一、追踪CronJob的运行时长
1. 脚本内嵌入时间记录
直接在Cron执行的业务脚本中添加启动/结束时间的日志记录,精准统计单任务时长:
# 脚本开头记录启动时间 START_TIME=$(date +%s) echo "Cron任务[backup.sh]启动于: $(date -d @$START_TIME '+%Y-%m-%d %H:%M:%S')" >> /var/log/cron_runtime.log # -------------------------- # 这里放你的业务脚本逻辑 # -------------------------- # 脚本结尾计算并记录持续时长 END_TIME=$(date +%s) DURATION=$((END_TIME - START_TIME)) echo "Cron任务[backup.sh]结束于: $(date -d @$END_TIME '+%Y-%m-%d %H:%M:%S'),持续时长: $DURATION 秒" >> /var/log/cron_runtime.log
2. 实时追踪运行中的Cron进程
通过pgrep和stat工具,直接查询正在运行的Cron任务已持续时长:
# 替换为你的Cron任务脚本名或关键字 TASK_NAME="backup.sh" # 获取任务PID PID=$(pgrep -f $TASK_NAME) if [ -n "$PID" ]; then # 获取进程启动时间戳 START_TIME=$(stat -c %X /proc/$PID) CURRENT_TIME=$(date +%s) DURATION=$((CURRENT_TIME - START_TIME)) echo "当前运行的[$TASK_NAME]已持续: $DURATION 秒" else echo "未找到运行中的[$TASK_NAME]进程" fi
二、长时间运行CronJob的监控与告警
1. 脚本内超时监控
在业务脚本中嵌入后台监控进程,当任务运行超过设定阈值时触发告警:
# 设置超时阈值(单位:秒,示例为1小时) TIMEOUT_THRESHOLD=3600 # 超时检查函数 check_timeout() { sleep $TIMEOUT_THRESHOLD # 检查主进程是否仍在运行 if ps -p $MAIN_PID > /dev/null; then # 发送告警(示例用邮件,可替换为企业微信/钉钉机器人接口) echo "Cron任务[backup.sh]运行已超过1小时,PID: $MAIN_PID" | mail -s "Cron任务超时告警" admin@yourdomain.com fi } # 记录主进程PID MAIN_PID=$$ # 启动后台监控子进程 check_timeout & TIMEOUT_PID=$! # 脚本结束时自动杀死监控子进程 trap "kill $TIMEOUT_PID" EXIT # -------------------------- # 这里放你的业务脚本逻辑 # --------------------------
2. 独立定时监控脚本
编写独立的监控脚本,通过Cron定期扫描所有运行中的Cron任务,批量检测超时情况:
#!/bin/bash # 超时阈值(单位:秒) THRESHOLD=3600 # 告警日志路径 ALERT_LOG="/var/log/cron_timeout_alerts.log" # 遍历所有非cron守护进程的相关任务 for PID in $(pgrep -f cron); do CMD=$(ps -o cmd= -p $PID) # 排除cron自身进程 if [ "$CMD" != "/usr/sbin/cron" ]; then START_TIME=$(stat -c %X /proc/$PID) CURRENT_TIME=$(date +%s) DURATION=$((CURRENT_TIME - START_TIME)) if [ $DURATION -gt $THRESHOLD ]; then ALERT_MSG="[$(date '+%Y-%m-%d %H:%M:%S')] 告警:Cron任务 '$CMD' (PID:$PID) 已运行 $DURATION 秒,超过阈值 $THRESHOLD 秒" echo $ALERT_MSG >> $ALERT_LOG # 发送告警邮件 echo $ALERT_MSG | mail -s "Cron任务超时告警" admin@yourdomain.com fi fi done
将该脚本保存为/usr/local/bin/check_cron_timeout.sh,添加执行权限:
chmod +x /usr/local/bin/check_cron_timeout.sh
然后加入Cron,每10分钟执行一次:
*/10 * * * * /usr/local/bin/check_cron_timeout.sh
内容的提问来源于stack exchange,提问作者Duanjax
相关产品推荐
相关产品推荐

