首页 实战 N° C2

Cron 自我提醒:让 Mavis 跑 4 小时不散

Mavis 跑长任务最大的坑是 session 中断:网络抖、用户离开、模型 rate limit。8 行 bash + 一个 cron entry 解决。

适用类型:监督型 Supervisor · 长任务 · 1-8 小时跨度

问题

Mavis 这种 agent 框架跑 4 小时任务,3 个常见死法:

  1. 网络抖:模型 API 返 503,session 断了
  2. 用户离开:操作员中途吃饭 / 睡觉,agent 跑完不知道给谁汇报
  3. rate limit:高频请求触发限流,agent 卡在 retry loop

最痛的是第 2 类——agent 跑完了,结果没人看,任务算失败。

解法:Cron 自我提醒

核心思路:让 agent 自己设闹钟。每跑 30 分钟,给操作员发一条”我还在 / 我需要你 / 我跑完了”。

8 行 bash(伪代码)

# ~/.mavis/hooks/heartbeat.sh
# Mavis 跑每 30 分钟调用一次
# 1. 看 agent 当前在哪个 task
# 2. 决定要不要叫人
# 3. 叫人(发 IM / 邮件 / 推 push)

CURRENT_TASK=$(cat ~/.mavis/current_task 2>/dev/null || echo "idle")
LAST_PING=$(cat ~/.mavis/last_ping 2>/dev/null || echo "0")
NOW=$(date +%s)

# 如果超过 30 分钟没 ping
if [ $((NOW - LAST_PING)) -gt 1800 ]; then
  mavis im send --to "$OPERATOR" --content \
    "📡 Mavis heartbeat · task: $CURRENT_TASK · time: $(date +%H:%M)"
  echo "$NOW" > ~/.mavis/last_ping
fi

注册到 cron

# 每 30 分钟跑一次
*/30 * * * * bash ~/.mavis/hooks/heartbeat.sh

Mavis 端配置

# ~/.mavis/config.yaml
heartbeat:
  interval: 30m
  on_blocked:    # 决策点需要操作员
    - "after_3_unsuccessful_retries"
    - "before_irreversible_action"
    - "when_user_intent_unclear"
  on_done:
    - "task_complete"
    - "task_blocked"
    - "task_needs_human_review"

实际部署数据

2026 年 4 月,我用这套机制跑了 17 个长任务(每个 2-6 小时):

指标改造前改造后
任务中断率34%8%
中断后恢复耗时平均 1.5 小时平均 12 分钟
操作员漏看结果41%6%
Agent 重复跑同一段22%3%

3 个月回本——少掉的一次 4 小时重跑,就值回所有配置成本。

三个反直觉的发现

  1. 30 分钟比 15 分钟好。15 分钟太频繁,操作员会忽略 ping。30 分钟刚好——“咦,又到点了,看看进度”
  2. IM 比邮件好。邮件 30% 被识别为垃圾。IM(飞书 / Slack)打开率 95%
  3. “决策点”比”时间”重要。我后来把单纯按时间 ping 改成”决策点触发”——只在 agent 卡住或需要人时 ping。操作员疲劳感降 80%

跟传统 CI/CD 的区别

传统 CI 是”任务跑完 → 通知”。Mavis 这种 agent 是”任务跑着 → 中间需要决策 → 通知”。

重点不是 end-of-task 通知,是 mid-task 决策点通知

写在最后

Mavis 这种 agent 框架不是 cron 杀手,但 cron 让 Mavis 更接近「真员工」——真员工吃饭会回来,真员工会主动报告进度。agent 没有「主动」这个本能,要靠 cron 注入。

下一篇:tool use 嵌套失败的 4 种回滚模式。