通过OpenClaw实现副业收入《OpenClaw赚钱实录从“养龙虾“到可持续变现的实践指南》Cron在 Gateway 内部运行而不是在模型内部。任务持久化存储在~/.openclaw/cron/目录下因此重启不会丢失调度计划。两种执行风格主会话Main session将系统事件加入队列然后在下一个心跳时运行。隔离会话Isolated在cron:或自定义会话中运行一个专用的 agent 轮次并可选择传递结果默认为 announce 或无。当前会话Current session绑定到创建 cron 时的会话sessionTarget: current。自定义会话Custom session在持久化的命名会话中运行sessionTarget: session:custom-id。唤醒是一等公民任务可以请求“立即唤醒”或“下一个心跳”。Webhook 发布是按任务配置的通过delivery.mode webhook和delivery.to 实现。对于设置了cron.webhook且带有notify: true的旧存储任务仍然存在遗留回退机制请将这些任务迁移到 webhook 传递模式。对于升级在调度器接触旧版 cron 存储字段之前openclaw doctor --fix可以规范化这些字段。快速开始可操作创建一个一次性提醒验证它是否存在并立即运行它openclawcronadd\--nameReminder\--at2026-02-01T16:00:00Z\--sessionmain\--system-eventReminder: check the cron docs draft\--wakenow\--delete-after-run openclawcronlist openclawcronrunjob-idopenclawcronruns--idjob-id调度一个带传递功能的周期性隔离任务openclawcronadd\--nameMorning brief\--cron0 7 * * *\--tzAmerica/Los_Angeles\--sessionisolated\--messageSummarize overnight updates.\--announce\--channelslack\--tochannel:C1234567890工具调用等效项Gateway cron 工具有关规范的 JSON 格式和示例请参阅 JSON schema for tool calls。Cron 任务的存储位置Cron 任务默认持久化存储在 Gateway 主机的~/.openclaw/cron/jobs.json文件中。Gateway 将该文件加载到内存中并在发生更改时将其写回因此手动编辑仅在 Gateway 停止时是安全的。更倾向于使用openclaw cron add/edit或 cron 工具调用 API 来进行更改。初学者友好概述将 cron 任务视为何时运行 做什么。选择一个调度一次性提醒 →schedule.kind atCLI:--at重复任务 →schedule.kind every或schedule.kind cron如果你的 ISO 时间戳省略了时区则视为UTC。选择运行位置sessionTarget: main→ 在下一次心跳期间使用主上下文运行。sessionTarget: isolated→ 在cron:中运行一个专用的 agent 轮次。sessionTarget: current→ 绑定到当前会话在创建时解析为session:。sessionTarget: session:custom-id→ 在一个持久化的命名会话中运行该会话在多次运行间保持上下文。默认行为未更改systemEvent有效负载默认为mainagentTurn有效负载默认为isolated要使用当前会话绑定请显式设置sessionTarget: current。选择有效负载主会话 →payload.kind systemEvent隔离会话 →payload.kind agentTurn可选一次性任务schedule.kind at默认在成功执行后删除。设置deleteAfterRun: false可以保留它们成功执行后它们将被禁用。概念任务一个 cron 任务是一个存储的记录包含一个调度何时运行一个有效负载做什么可选的传递模式announce、webhook或none。可选的agent 绑定agentId在特定的 agent 下运行任务如果缺失或未知gateway 将回退到默认 agent。任务通过稳定的jobId标识用于 CLI/Gateway API。在 agent 工具调用中jobId是规范的出于兼容性考虑也接受旧的id。一次性任务默认在成功执行后自动删除设置deleteAfterRun: false可以保留它们。调度Cron 支持三种调度类型at通过schedule.atISO 8601指定的一次性时间戳。every固定间隔毫秒。cron5 字段的 cron 表达式或带秒的 6 字段带有可选的 IANA 时区。Cron 表达式使用croner。如果省略时区则使用 Gateway 主机的本地时区。为了减少众多 gateway 在整点时的负载峰值OpenClaw 会对周期性的整点表达式例如0 * * * *、0 */2 * * *应用一个确定性的、每个任务最多 5 分钟的错开窗口。固定小时的表达式例如0 7 * * *保持精确。对于任何 cron 调度你可以使用schedule.staggerMs设置一个显式的错开窗口0表示保持精确计时。CLI 快捷方式--stagger 30s或1m、5m设置显式的错开窗口。--exact强制设置staggerMs 0。主会话与隔离执行主会话任务系统事件主任务将系统事件加入队列并可选择唤醒心跳执行器。它们必须使用payload.kind systemEvent。wakeMode: now默认事件触发立即执行一次心跳。wakeMode: next-heartbeat事件等待下一个计划的心跳。这是当你想要正常的心跳提示 主会话上下文时的最佳选择。请参阅 Heartbeat。隔离任务专用 cron 会话隔离任务在会话cron:或自定义会话中运行一个专用的 agent 轮次。主要行为提示前缀为[cron: ]以便于追踪。每次运行都从一个新的会话 id开始除非使用自定义会话否则不会延续之前的对话。自定义会话session:xxx在多次运行间保持上下文支持诸如每日站会等基于先前摘要构建的工作流。默认行为如果省略delivery隔离任务会通告一个摘要delivery.mode announce。delivery.mode选择要执行的操作announce将摘要传递到目标频道并将简短摘要发布到主会话。webhook当完成的事件包含摘要时将完成的事件有效负载 POST 到delivery.to。none仅在内部使用不传递不向主会话发布摘要。wakeMode控制主会话摘要的发布时间now立即心跳。next-heartbeat等待下一个计划的心跳。对于嘈杂、频繁或不应充斥主聊天历史的“后台杂务”请使用隔离任务。有效负载格式运行什么支持两种有效负载类型systemEvent仅限主会话通过心跳提示路由。agentTurn仅限隔离会话运行一个专用的 agent 轮次。常见的agentTurn字段message必需的文本提示。model/thinking可选的覆盖设置见下文。timeoutSeconds可选的超时覆盖。lightContext可选的精简引导模式适用于不需要工作区引导文件注入的任务。传递配置delivery.modenone|announce|webhook。delivery.channellast或特定频道。delivery.to特定于频道的目标announce 模式或 webhook URLwebhook 模式。delivery.bestEffort如果通告传递失败避免任务失败。通告传递会抑制该运行的消息传递工具发送使用delivery.channel/delivery.to将目标指向聊天。当delivery.mode none时不会向主会话发布摘要。如果隔离任务省略了deliveryOpenClaw 默认为announce。通告传递流程当delivery.mode announce时cron 直接通过出站频道适配器进行传递。主 agent 不会被启动来构建或转发消息。行为细节内容传递使用隔离运行的出站有效负载文本/媒体并进行正常的分块和频道格式化。仅心跳的响应HEARTBEAT_OK且无实际内容不会被传递。如果隔离运行已经通过消息工具向同一目标发送了消息则跳过传递以避免重复。缺失或无效的传递目标会导致任务失败除非delivery.bestEffort true。仅当delivery.mode announce时才会向主会话发布简短摘要。主会话摘要遵循wakeModenow触发立即心跳next-heartbeat等待下一个计划的心跳。Webhook 传递流程当delivery.mode webhook时当完成的事件包含摘要时cron 会将完成的事件有效负载 POST 到delivery.to。行为细节端点必须是有效的 HTTP(S) URL。在 webhook 模式下不会尝试频道传递。在 webhook 模式下不会向主会话发布摘要。如果设置了cron.webhookToken则验证头为Authorization: Bearer token。已弃用的回退存储的带有notify: true的旧任务仍然会 POST 到cron.webhook如果已配置并会发出警告以便你迁移到delivery.mode webhook。模型和思考覆盖隔离任务agentTurn可以覆盖模型和思考级别model提供者/模型字符串例如anthropic/claude-sonnet-4-20250514或别名例如opusthinking思考级别off、minimal、low、medium、high、xhigh仅限 GPT-5.2 和 Codex 模型注意你也可以在主会话任务上设置model但这会更改共享的主会话模型。我们建议仅在隔离任务上使用模型覆盖以避免意外的上下文切换。解析优先级任务有效负载覆盖最高钩子特定默认值例如hooks.gmail.modelAgent 配置默认值精简引导上下文隔离任务agentTurn可以设置lightContext: true以使用精简引导上下文运行。将此用于不需要工作区引导文件注入的计划性任务。在实践中嵌入式运行时会以bootstrapContextMode: lightweight运行这有意使 cron 引导上下文为空。CLI 等效项openclaw cron add --light-context ...和openclaw cron edit --light-context。传递频道 目标隔离任务可以通过顶级delivery配置将输出传递到频道delivery.modeannounce频道传递、webhookHTTP POST或none。delivery.channelwhatsapp/telegram/discord/slack/mattermost插件 /signal/imessage/last。delivery.to特定于频道的接收者目标。announce传递仅对隔离任务sessionTarget: isolated有效。webhook传递对主任务和隔离任务均有效。如果省略delivery.channel或delivery.tocron 可以回退到主会话的“最后路由”agent 最后回复的地方。目标格式提醒Slack/Discord/Mattermost插件目标应使用显式前缀例如channel:、user:以避免歧义。Mattermost 的纯 26 字符 ID 解析为用户优先如果用户存在则为 DM否则为频道——对于确定性路由请使用user:或channel:。Telegram 主题应使用:topic:形式见下文。Telegram 传递目标主题/论坛线程Telegram 通过message_thread_id支持论坛主题。对于 cron 传递你可以将主题/线程编码到to字段中-1001234567890仅聊天 ID-1001234567890:topic:123首选显式主题标记-1001234567890:123简写数字后缀带有前缀的目标如telegram:.../telegram:group:...同样被接受telegram:group:-1001234567890:topic:123用于工具调用的 JSON 模式在直接调用 Gatewaycron.*工具agent 工具调用或 RPC时请使用以下格式。CLI 标志接受人类可读的持续时间如20m但工具调用应对schedule.at使用 ISO 8601 字符串对schedule.everyMs使用毫秒数。cron.add 参数一次性、主会话任务系统事件{name:Reminder,schedule:{kind:at,at:2026-02-01T16:00:00Z},sessionTarget:main,wakeMode:now,payload:{kind:systemEvent,text:Reminder text},deleteAfterRun:true}周期性、带传递功能的隔离任务{name:Morning brief,schedule:{kind:cron,expr:0 7 * * *,tz:America/Los_Angeles},sessionTarget:isolated,wakeMode:next-heartbeat,payload:{kind:agentTurn,message:Summarize overnight updates.,lightContext:true},delivery:{mode:announce,channel:slack,to:channel:C1234567890,bestEffort:true}}绑定到当前会话的周期性任务创建时自动解析{name:Daily standup,schedule:{kind:cron,expr:0 9 * * *},sessionTarget:current,payload:{kind:agentTurn,message:Summarize yesterdays progress.}}在自定义持久化会话中的周期性任务{name:Project monitor,schedule:{kind:every,everyMs:300000},sessionTarget:session:project-alpha-monitor,payload:{kind:agentTurn,message:Check project status and update the running log.}}注意schedule.kindat需要at、every需要everyMs或cron需要expr可选tz。schedule.at接受 ISO 8601 格式时区可选省略时视为 UTC。everyMs的单位是毫秒。sessionTargetmain、isolated、current或session:id。current在创建时解析为session:id。自定义会话session:xxx在多次运行间保持持久化上下文。可选字段agentId、description、enabled、deleteAfterRun对于at默认为 true、delivery。wakeMode省略时默认为now。cron.update 参数{jobId:job-123,patch:{enabled:false,schedule:{kind:every,everyMs:3600000}}}注意jobId是规范的出于兼容性也接受id。在 patch 中使用agentId: null来清除 agent 绑定。cron.run 和 cron.remove 参数{jobId:job-123,mode:force}{jobId:job-123}存储与历史记录任务存储~/.openclaw/cron/jobs.jsonGateway 管理的 JSON。运行历史记录~/.openclaw/cron/runs/job-id.jsonlJSONL 格式按大小和行数自动修剪。sessions.json中的隔离 cron 运行会话由cron.sessionRetention修剪默认24h设置为false可禁用。覆盖存储路径配置文件中的cron.store。重试策略当任务失败时OpenClaw 将错误分类为瞬时错误可重试或永久错误立即禁用。瞬时错误会重试速率限制429请求过多资源耗尽提供者过载例如 Anthropic529 overloaded_error过载回退摘要网络错误超时、ECONNRESET、fetch 失败、套接字错误服务器错误5xx与 Cloudflare 相关的错误永久错误不会重试认证失败无效的 API 密钥未授权配置或验证错误其他非瞬时错误默认行为无配置一次性任务schedule.kind: at发生瞬时错误时最多重试 3 次采用指数退避30秒 → 1分钟 → 5分钟。发生永久错误时立即禁用。成功或跳过时禁用如果deleteAfterRun: true则删除。周期性任务cron/every发生任何错误时在下一次计划运行之前应用指数退避30秒 → 1分钟 → 5分钟 → 15分钟 → 60分钟。任务保持启用状态退避在下一次成功运行后重置。配置cron.retry可以覆盖这些默认值请参阅 Configuration。配置{ cron: { enabled: true, // 默认为 true store: ~/.openclaw/cron/jobs.json, maxConcurrentRuns: 1, // 默认为 1 // 可选覆盖一次性任务的重试策略 retry: { maxAttempts: 3, backoffMs: [60000, 120000, 300000], retryOn: [rate_limit, overloaded, network, server_error], }, webhook: https://example.invalid/legacy, // 已弃用用于存储的 notify:true 任务的回退 webhookToken: replace-with-dedicated-webhook-token, // 可选的 webhook 模式承载令牌 sessionRetention: 24h, // 持续时间字符串或 false runLog: { maxBytes: 2mb, // 默认为 2_000_000 字节 keepLines: 2000, // 默认为 2000 }, }, }运行日志修剪行为cron.runLog.maxBytes修剪前的最大运行日志文件大小。cron.runLog.keepLines修剪时仅保留最新的 N 行。两者都适用于cron/runs/job-id.jsonl文件。Webhook 行为首选为每个任务设置delivery.mode: webhook和delivery.to: https://...。Webhook URL 必须是有效的http://或https://URL。发布时有效负载是 cron 完成的事件 JSON。如果设置了cron.webhookToken则验证头为Authorization: Bearer token。如果未设置cron.webhookToken则不会发送Authorization头。已弃用的回退存储的带有notify: true的旧任务在cron.webhook存在时仍会使用它。完全禁用 croncron.enabled: false配置OPENCLAW_SKIP_CRON1环境变量维护Cron 有两个内置的维护路径隔离运行会话保留和运行日志修剪。默认值cron.sessionRetention24h设置为false可禁用运行会话修剪cron.runLog.maxBytes2_000_000字节cron.runLog.keepLines2000工作原理隔离运行会创建会话条目...:cron:jobId:run:runId和转录文件。回收器会移除超过cron.sessionRetention的过期运行会话条目。对于已移除且会话存储不再引用的运行会话OpenClaw 会归档转录文件并在相同的保留窗口内清除旧的已删除归档。每次运行追加后都会检查cron/runs/job-id.jsonl的大小如果文件大小超过runLog.maxBytes则将其修剪为最新的runLog.keepLines行。高容量调度器的性能注意事项高频率的 cron 设置可能会产生大量的运行会话和运行日志占用空间。虽然内置了维护功能但宽松的限制仍然可能产生可避免的 IO 和清理工作。需要注意什么长的cron.sessionRetention窗口加上许多隔离运行高的cron.runLog.keepLines结合大的runLog.maxBytes许多嘈杂的周期性任务写入相同的cron/runs/job-id.jsonl文件该怎么做保持cron.sessionRetention尽可能短以满足你的调试/审计需求使用适中的runLog.maxBytes和runLog.keepLines来限制运行日志将嘈杂的后台任务移至隔离模式并使用适当的传递规则以避免不必要的通信定期使用openclaw cron runs检查增长情况并在日志变得过大之前调整保留策略自定义示例将运行会话保留一周并允许更大的运行日志{ cron: { sessionRetention: 7d, runLog: { maxBytes: 10mb, keepLines: 5000, }, }, }禁用隔离运行会话修剪但保留运行日志修剪{ cron: { sessionRetention: false, runLog: { maxBytes: 5mb, keepLines: 3000, }, }, }针对高容量 cron 使用进行调整示例{ cron: { sessionRetention: 12h, runLog: { maxBytes: 3mb, keepLines: 1500, }, }, }CLI 快速入门一次性提醒UTC ISO成功执行后自动删除openclawcronadd\--nameSend reminder\--at2026-01-12T18:00:00Z\--sessionmain\--system-eventReminder: submit expense report.\--wakenow\--delete-after-run一次性提醒主会话立即唤醒openclawcronadd\--nameCalendar check\--at20m\--sessionmain\--system-eventNext heartbeat: check calendar.\--wakenow周期性隔离任务通告到 WhatsAppopenclawcronadd\--nameMorning status\--cron0 7 * * *\--tzAmerica/Los_Angeles\--sessionisolated\--messageSummarize inbox calendar for today.\--announce\--channelwhatsapp\--to15551234567具有显式 30 秒错开的周期性 cron 任务openclawcronadd\--nameMinute watcher\--cron0 * * * * *\--tzUTC\--stagger30s\--sessionisolated\--messageRun minute watcher checks.\--announce周期性隔离任务传递到 Telegram 主题openclawcronadd\--nameNightly summary (topic)\--cron0 22 * * *\--tzAmerica/Los_Angeles\--sessionisolated\--messageSummarize today; send to the nightly topic.\--announce\--channeltelegram\--to-1001234567890:topic:123具有模型和思考覆盖的隔离任务openclawcronadd\--nameDeep analysis\--cron0 6 * * 1\--tzAmerica/Los_Angeles\--sessionisolated\--messageWeekly deep analysis of project progress.\--modelopus\--thinkinghigh\--announce\--channelwhatsapp\--to15551234567Agent 选择多 agent 设置# 将任务固定到 agent ops如果该 agent 缺失则回退到默认 agentopenclawcronadd--nameOps sweep--cron0 6 * * *--sessionisolated--messageCheck ops queue--agentops# 切换或清除现有任务上的 agentopenclawcroneditjob-id--agentops openclawcroneditjob-id--clear-agent手动运行force 是默认值使用--due仅在到期时运行openclawcronrunjob-idopenclawcronrunjob-id--duecron.run现在仅在手动运行被排队后确认而不是在任务完成后。成功的排队响应类似于{ ok: true, enqueued: true, runId }。如果任务已在运行或--due未找到到期任务响应保持为{ ok: true, ran: false, reason }。使用openclaw cron runs --id job-id或cron.runsgateway 方法来检查最终的完成条目。编辑现有任务修补字段openclawcroneditjob-id\--messageUpdated prompt\--modelopus\--thinkinglow强制现有 cron 任务严格按照计划运行无错开openclawcroneditjob-id--exact运行历史记录openclawcronruns--idjob-id--limit50在不创建任务的情况下立即执行系统事件openclaw system event--modenow--textNext heartbeat: check battery.Gateway API 表面cron.list、cron.status、cron.add、cron.update、cron.removecron.runforce 或 due、cron.runs对于不带任务的即时系统事件请使用openclaw system event。故障排除“没有任何东西运行”检查 cron 是否已启用cron.enabled和OPENCLAW_SKIP_CRON。检查 Gateway 是否持续运行cron 在 Gateway 进程内部运行。对于cron调度确认时区--tz与主机时区是否匹配。周期性任务在失败后持续延迟OpenClaw 在连续错误后对周期性任务应用指数退避重试30秒、1分钟、5分钟、15分钟然后在重试之间间隔60分钟。退避会在下一次成功运行后自动重置。一次性at任务会重试瞬时错误速率限制、过载、网络、server_error最多3次并带有退避永久错误会立即禁用。请参阅 重试策略。Telegram 传递到错误的地方对于论坛主题使用-100…:topic:这样明确且无歧义。如果你在日志或存储的“最后路由”目标中看到telegram:...前缀这是正常的cron 传递接受它们并且仍然能正确解析主题 ID。子 agent 通告传递重试当子 agent 运行完成时gateway 会将结果通告给请求者会话。如果通告流程返回false例如请求者会话正忙gateway 会通过announceRetryCount跟踪最多重试3次。超过endedAt后5分钟的通告将被强制过期以防止陈旧条目无限循环。如果你在日志中看到重复的通告传递请检查子 agent 注册表中announceRetryCount值较高的条目。