Cron 自我提醒:让 Mavis 跑 4 小时不散
Mavis 跑长任务最大的坑是 session 中断:网络抖、用户离开、模型 rate limit。8 行 bash + 一个 cron entry 解决。
适用类型:监督型 Supervisor · 长任务 · 1-8 小时跨度
问题
Mavis 这种 agent 框架跑 4 小时任务,3 个常见死法:
- 网络抖:模型 API 返 503,session 断了
- 用户离开:操作员中途吃饭 / 睡觉,agent 跑完不知道给谁汇报
- 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 小时重跑,就值回所有配置成本。
三个反直觉的发现
- 30 分钟比 15 分钟好。15 分钟太频繁,操作员会忽略 ping。30 分钟刚好——“咦,又到点了,看看进度”
- IM 比邮件好。邮件 30% 被识别为垃圾。IM(飞书 / Slack)打开率 95%
- “决策点”比”时间”重要。我后来把单纯按时间 ping 改成”决策点触发”——只在 agent 卡住或需要人时 ping。操作员疲劳感降 80%
跟传统 CI/CD 的区别
传统 CI 是”任务跑完 → 通知”。Mavis 这种 agent 是”任务跑着 → 中间需要决策 → 通知”。
重点不是 end-of-task 通知,是 mid-task 决策点通知。
写在最后
Mavis 这种 agent 框架不是 cron 杀手,但 cron 让 Mavis 更接近「真员工」——真员工吃饭会回来,真员工会主动报告进度。agent 没有「主动」这个本能,要靠 cron 注入。
下一篇:tool use 嵌套失败的 4 种回滚模式。