Agent · AI 工程

Cron / Routine / Schedule 辨析

Cron、Routine、Schedule、launchd、Hook、Webhook、/loop、GitHub Actions…… 一堆词都在说"让某件事自动地发生",但触发方式、运行位置、能不能碰本地文件各不相同。本文给你一把万能钥匙:遇到任何一个词,先套三个问题,再配一张决策表,从此不再混。

篇幅 5 章 · 约 7 分钟 受众 用自动化 / Claude Code 的人 主线 三问 · 术语表 · 决策表 · 易混对 · 一句话记忆
01

SECTION ONE · THE THREE QUESTIONS

先问三个问题,混淆就化解一半

这些词之所以容易混,是因为大家把"自动化"当成一个整体。其实任何一个机制,都可以被这三个问题唯一定位。先看最关键的第一问 —— 它什么时候跑?

🕐
定时驱动 · Time
到点就跑
按时间表触发:每天 9 点、每 5 分钟一次。不管有没有事发生,时间到了就执行。
cron · launchd · Routine · GHA schedule · /loop
事件驱动 · Event
发生某事才跑
被某个动作触发:commit、push、工具调用、收到一个 HTTP 请求。没事就一直不动。
Hook · Webhook · GHA on:push
♾️
常驻运行 · Always-on
一直开着
进程不退出,自己在内部循环或监听。不是"到点跑"也不是"被触发",而是"从不停"。
Worker · Daemon · 常驻 bot

第一问解决了"何时跑"。再补两问,就能把任何机制钉死:

问题二 · 在哪里跑? 本地机器(launchd)/ 云端(Routine、GitHub Actions)/ Claude 会话内(/loop)。这决定了「你的电脑关机后它还跑不跑」。
问题三 · 能碰到什么? 需要本地 secrets / 文件 / keychain 吗?需要 → 只能本地(launchd);无状态的摘要 / 报告 → 云端最省心。
万能口诀 · 遇到任何一个陌生的自动化词,先问:① 何时跑(定时 / 事件 / 常驻)② 在哪跑(本地 / 云端 / 会话内)③ 能碰本地状态吗。三问答完,它是什么、该不该用,立刻清楚。
02

SECTION TWO · GLOSSARY

术语逐个拆:它是什么 · 别被名字骗了

下面每张卡片,左上是术语,右上的色标是它的类别蓝=定时 · 紫=事件 · 绿=常驻 · 灰=概念/工具)。底部黄字是最常见的误解

Cron概念 / 语法
"定时任务"的统称,也指那串 cron 表达式* * * * * 五个字段)。它是一种约定 / 语法,不是某个具体程序。
误解:把 cron 当成一个软件。其实"用 cron"= 用某个支持 cron 语法的调度器(crontab / launchd / Routine / GHA 都能吃 cron 表达式)。
crontab定时
Linux/Unix 上配置 cron 任务的具体工具与配置文件crontab -e)。cron 概念的经典实现。
误解:cron = crontab。cron 是概念,crontab 只是它在 Unix 上的一个实现;Mac 上的对应物是 launchd。
launchd定时 · 本地
macOS 的原生调度器,定时跑本地任务的正解。关键能力:能访问本地 secrets / 文件 / keychain —— 这是云端方案做不到的。
记住:凡是"需要读本地凭据 / 本地文件"的定时任务,只能 launchd,不能丢云端。
Routine定时 · 云端
Claude Code 的云端定时 agent(本质 = 云端 cron + 一个 Claude)。你的电脑关机 / 离线照跑,且不占 GitHub Actions 额度。
用途:无状态的定期摘要 / 报告 / 轻量 agent。需要本地文件的别用它(用 launchd)。
/schedule命令入口
Claude Code 里创建 / 改 / 列 / 跑 Routine 的 skill。它是"遥控器",不是机制本身。也能安排一次性定时("明天 3 点跑一次")。
误解:把 /schedule 和 Routine 当成两个东西。/schedule 是操作面板,Routine 是被它创建出来的那个云端定时任务。
/loop定时 · 会话内
当前 Claude 会话内按间隔重复跑一个 prompt / 命令(/loop 5m /foo)。也可省略间隔,让模型自己定步调。
关键:它依赖会话活着 —— 关掉会话就停。适合"盯着某事直到完成",不适合长期无人值守(那是 Routine 的活)。
ScheduleWakeup定时 · 会话内
/loop 动态模式的底层机制:让 Claude 自己决定"多久之后再醒来"继续干活,按需自定步调,而非固定间隔。
定位:不是你直接用的命令,是 /loop 自调度时在背后调用的"设个闹钟叫醒我"。
CronCreate / List / Delete定时 · 云端
Claude Code 里用 cron 表达式编排定时 agent 的底层工具(CronCreate 模式的 autonomous loop)。/schedule 在背后用的就是这类工具。
关系:CronCreate 是底层零件,/schedule 是给人用的封装。日常用 /schedule 就够。
Hook / hookify事件
事件驱动,不是定时。在工具调用前后、commit、push 等事件发生时同步阻塞执行。规则写死在那儿,不会被忘
误解:以为 hook 会"定时检查"。不会 —— 它只在那个事件发生的瞬间触发,平时完全静默。
Webhook事件 · 网络
外部系统通过 HTTP 主动"推"给你的事件回调(如 Stripe 支付成功通知你的服务器)。你被动收,不用一直去问。
误解:Webhook 和 Hook 是一回事。完全不同 —— Hook 是本地拦截你自己的动作,Webhook 是别人从网络推事件过来。
GitHub Actions定时 + 事件 · 云端
云端 CI/CD。两种触发都支持on: schedule(cron 定时)+ on: push/pull_request(事件)。和 git 深度绑定。
用途:合并门禁 / PR 审查 / 部署链路这类"跟着 git 走"的事。纯定时摘要用它有点重,Routine 更轻。
Worker / Daemon常驻
一直开着的进程,自己在内部循环或监听队列 / 端口。既非到点跑,也非被外部触发 —— 是"从不停"。
区别:定时任务跑完就退出,下次再起;常驻进程永不退出。两者运维方式(重启 / 心跳监控)完全不同。
轮询 vs 推送触发维度
轮询 Polling:自己定时去问"好了没?"(定时驱动)。推送 Push:对方有事主动通知你(事件驱动,如 Webhook)。
取舍:能推送就别轮询 —— 轮询费资源又有延迟。但对方不支持推送时,只能定时轮询兜底。
Job / Task / Trigger泛称
Job / Task = 要被执行的"那件事"。Trigger = "触发它的条件"(时间到 / 事件发生)。调度器 = 把 Trigger 和 Job 接起来的东西。
厘清:cron / launchd / hook 是 Trigger 机制;你写的脚本 / agent 是 Job。别把"用什么触发"和"触发后干什么"混为一谈。

顺手看懂 cron 表达式

那串 * * * * * 经常吓人,其实就五个位置,从左到右:

0–59 · 0–23 · 1–31 · 1–12 · 0–6(0=周日)
0 9 * * * = 每天 9:00 · */5 * * * * = 每 5 分钟 · 0 9 * * 1 = 每周一 9:00
03

SECTION THREE · DECISION TABLE

什么场景,用哪个

记不住所有术语没关系 —— 真正要做事时,直接查这张场景 → 选型表(这也是团队 CLAUDE.md 里"自动化/调度按场景选"的扩展版)。

你的场景选它为什么
工具调用前后 / commit / push 时即时拦截、强制规则 Hook (hookify) 事件驱动 + 同步阻塞,规则写死不会被忘
定时任务,但要读本地 secrets / 文件 / keychain launchd 唯一能访问本地状态;云端方案碰不到本地
无状态的定期摘要 / 报告 / 轻量 agent Routine(/schedule) 云端 cron,本机离线照跑,不占 GHA 额度
合并门禁 / PR 审查 / 部署链路 GitHub Actions 已和 git push 绑定,跟着代码走
会话内盯着某件事重复跑,直到它完成 /loop 在当前 Claude 会话里循环;关会话即停
外部系统(支付 / OAuth / 第三方)有事通知我 Webhook 事件推送,无需自己定时轮询
需要一个永远在线、持续监听 / 消费队列的服务 Worker / Daemon 常驻进程,从不退出
选型铁律 · 别默认走某一个。先过三问:要不要碰本地状态?跟不跟 git 走?要长期无人值守还是只盯这一会儿?答案直接指向上表某一行。
04

SECTION FOUR · EASILY CONFUSED

最容易搞混的几对,正面 PK

Routine vs launchd

Routine(云端)

跑在云端,你电脑关机照跑。但碰不到本地文件 / 凭据。适合无状态摘要、报告。

vs

launchd(本地)

跑在你的 Mac 上,能读本地 secrets / 文件 / keychain。但电脑关机就不跑。

一句话 · 都是定时,区别在云端 vs 本地 + 能否碰本地状态

Routine vs /loop

Routine

独立的云端定时 agent,长期无人值守,按 cron 反复跑。

vs

/loop

当前会话内循环,关掉会话就停。适合临时盯一件事到完成。

一句话 · 想"放着不管它自己长期跑"用 Routine;想"这次盯到好为止"用 /loop。

Hook vs Webhook

Hook

本地拦截你自己的动作(工具调用 / commit / push),同步阻塞。

vs

Webhook

别人从网络推事件给你的 HTTP 回调,你被动接收。

一句话 · 名字像,方向相反:Hook 是"拦我自己",Webhook 是"接外面推来的"。

Cron vs crontab vs /schedule

Cron

定时的概念 + 语法(那串表达式),抽象层。

crontab / launchd / /schedule

吃 cron 语法、真正去执行的具体调度器 / 入口。

一句话 · Cron 是"怎么描述时间",后面几个是"谁来按这个时间干活"。
05

SECTION FIVE · TAKEAWAY

一句话装进脑子

把这页浓缩成一行心法 —— 以后遇到任何"让某事自动发生"的词,不用背定义,套这一句就够:

先问 何时跑 · 在哪跑 · 碰不碰本地
三问答完,选型自现。
速记 · 定时 → cron / launchd(本地)/ Routine(云端)/ /loop(会话内); 事件 → Hook(拦自己)/ Webhook(接外面)/ GHA on:push; 常驻 → Worker / Daemon。