You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取运行中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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 05:06:25