Automation
งานตามกำหนดเวลา
Cron คือ scheduler ในตัวของ Gateway โดยจะคงอยู่ของ jobs, ปลุก agent ในเวลาที่ถูกต้อง และสามารถส่ง output กลับไปยัง chat channel หรือ webhook endpoint ได้
เริ่มต้นอย่างรวดเร็ว
เพิ่มการแจ้งเตือนแบบครั้งเดียว
openclaw cron add \ --name "Reminder" \ --at "2026-02-01T16:00:00Z" \ --session main \ --system-event "Reminder: check the cron docs draft" \ --wake now \ --delete-after-runตรวจสอบ jobs ของคุณ
openclaw cron listopenclaw cron get <job-id>openclaw cron show <job-id>ดูประวัติการรัน
openclaw cron runs --id <job-id>Cron ทำงานอย่างไร
- Cron รัน ภายใน process ของ Gateway (ไม่ใช่ภายใน model)
- นิยามของ job จะคงอยู่ที่
~/.openclaw/cron/jobs.jsonดังนั้นการรีสตาร์ตจะไม่ทำให้ schedules สูญหาย - สถานะการดำเนินงานระหว่าง runtime จะคงอยู่ข้างกันใน
~/.openclaw/cron/jobs-state.jsonหากคุณติดตามนิยาม cron ใน git ให้ติดตามjobs.jsonและเพิ่มjobs-state.jsonใน gitignore - หลังการแยกนี้ OpenClaw เวอร์ชันเก่าสามารถอ่าน
jobs.jsonได้ แต่อาจถือว่า jobs เป็นรายการใหม่เพราะ runtime fields ตอนนี้อยู่ในjobs-state.json - เมื่อ
jobs.jsonถูกแก้ไขระหว่างที่ Gateway กำลังรันหรือหยุดอยู่ OpenClaw จะเปรียบเทียบ schedule fields ที่เปลี่ยนแปลงกับ metadata ของ pending runtime slot และล้างค่าnextRunAtMsที่ล้าสมัย การแก้เฉพาะรูปแบบหรือการเขียนใหม่ที่เปลี่ยนเฉพาะลำดับคีย์จะคง pending slot ไว้ - การดำเนินการ cron ทั้งหมดจะสร้างบันทึก background task
- เมื่อ Gateway เริ่มทำงาน jobs แบบ isolated agent-turn ที่เลยกำหนดแล้วจะถูกกำหนดเวลาใหม่ให้ออกจากช่วง channel-connect แทนที่จะ replay ทันที เพื่อให้การเริ่มต้น Discord/Telegram และการตั้งค่า native-command ยังคงตอบสนองได้ดีหลังรีสตาร์ต
- Jobs แบบครั้งเดียว (
--at) จะลบตัวเองหลังสำเร็จตามค่าเริ่มต้น - การรัน cron แบบ isolated จะพยายามปิด browser tabs/processes ที่ติดตามไว้สำหรับ session
cron:<jobId>ของตนเมื่อการรันเสร็จสิ้น เพื่อไม่ให้การทำ browser automation แบบแยกตัวทิ้ง processes กำพร้าไว้ - การรัน cron แบบ isolated ที่ได้รับสิทธิ์ cron self-cleanup แบบแคบยังสามารถอ่านสถานะ scheduler, รายการ current job ของตนที่ถูกกรองเฉพาะตัวเอง และประวัติการรันของ job นั้นได้ เพื่อให้การตรวจสอบ status/heartbeat ตรวจสอบ schedule ของตนเองได้โดยไม่ต้องได้สิทธิ์แก้ไข cron ที่กว้างกว่า
- การรัน cron แบบ isolated ยังป้องกัน stale acknowledgement replies ด้วย หากผลลัพธ์แรกเป็นเพียง interim status update (
on it,pulling everything togetherและคำใบ้ที่คล้ายกัน) และไม่มี descendant subagent run ที่ยังรับผิดชอบคำตอบสุดท้ายอยู่ OpenClaw จะ prompt ซ้ำหนึ่งครั้งเพื่อขอผลลัพธ์จริงก่อนส่งมอบ - การรัน cron แบบ isolated จะเลือกใช้ structured execution-denial metadata จาก embedded run ก่อน จากนั้นจึง fallback ไปยัง final summary/output markers ที่รู้จัก เช่น
SYSTEM_RUN_DENIEDและINVALID_REQUESTเพื่อไม่ให้คำสั่งที่ถูกบล็อกถูกรายงานว่าเป็นการรันที่สำเร็จ - การรัน cron แบบ isolated ยังถือว่า agent failures ระดับ run เป็น job errors แม้ไม่มี reply payload ถูกสร้างขึ้น เพื่อให้ model/provider failures เพิ่ม error counters และเรียก failure notifications แทนที่จะล้าง job ว่าสำเร็จ
- เมื่อ job แบบ isolated agent-turn ถึง
timeoutSecondscron จะ abort agent run พื้นฐานและให้ช่วง cleanup สั้น ๆ หาก run ไม่ drain การ cleanup ที่ Gateway เป็นเจ้าของจะ force-clear session ownership ของ run นั้นก่อนที่ cron จะบันทึก timeout เพื่อไม่ให้งาน chat ที่เข้าคิวค้างอยู่หลัง stale processing session - หาก isolated agent-turn ค้างก่อน runner เริ่มต้นหรือก่อน model call แรก cron จะบันทึก phase-specific timeout เช่น
setup timed out before runner startหรือstalled before first model call (last phase: context-engine)watchdogs เหล่านี้ครอบคลุม embedded providers และ CLI-backed providers ก่อนที่ process ของ CLI ภายนอกจะเริ่มจริง และถูกจำกัดแยกจากค่าtimeoutSecondsที่ยาว เพื่อให้ cold-start/auth/context failures ปรากฏอย่างรวดเร็วแทนที่จะรอจนเต็มงบเวลาของ job
ประเภท schedule
| ชนิด | CLI flag | คำอธิบาย |
|---|---|---|
at |
--at |
timestamp แบบครั้งเดียว (ISO 8601 หรือแบบ relative เช่น 20m) |
every |
--every |
ช่วงเวลาแบบคงที่ |
cron |
--cron |
cron expression แบบ 5-field หรือ 6-field พร้อม --tz แบบไม่บังคับ |
Timestamps ที่ไม่มี timezone จะถูกถือว่าเป็น UTC เพิ่ม --tz America/New_York สำหรับการกำหนดเวลาแบบ local wall-clock
Expressions แบบ recurring top-of-hour จะถูก stagger อัตโนมัติได้สูงสุด 5 นาทีเพื่อลด load spikes ใช้ --exact เพื่อบังคับ timing ที่แม่นยำ หรือ --stagger 30s สำหรับ window ที่ระบุชัดเจน
Day-of-month และ day-of-week ใช้ตรรกะ OR
Cron expressions ถูก parse โดย croner เมื่อทั้ง fields day-of-month และ day-of-week ไม่ใช่ wildcard, croner จะ match เมื่อ field ใด field หนึ่ง match ไม่ใช่ทั้งคู่ นี่คือพฤติกรรมมาตรฐานของ Vixie cron
# Intended: "9 AM on the 15th, only if it's a Monday"# Actual: "9 AM on every 15th, AND 9 AM on every Monday"0 9 15 * 1สิ่งนี้จะ fire ประมาณ 5-6 ครั้งต่อเดือนแทนที่จะเป็น 0-1 ครั้งต่อเดือน OpenClaw ใช้พฤติกรรม OR เริ่มต้นของ Croner ที่นี่ หากต้องการบังคับทั้งสองเงื่อนไข ให้ใช้ modifier day-of-week + ของ Croner (0 9 15 * +1) หรือ schedule บน field หนึ่งแล้ว guard อีก field ใน prompt หรือ command ของ job
รูปแบบการดำเนินการ
| รูปแบบ | ค่า --session |
รันใน | เหมาะที่สุดสำหรับ |
|---|---|---|---|
| Main session | main |
Heartbeat turn ถัดไป | Reminders, system events |
| Isolated | isolated |
cron:<jobId> เฉพาะ |
Reports, background chores |
| Current session | current |
ผูกไว้ตอนสร้าง | งาน recurring ที่รับรู้ context |
| Custom session | session:custom-id |
Persistent named session | Workflows ที่ต่อยอดจาก history |
Main session เทียบกับ isolated เทียบกับ custom
Jobs แบบ Main session จะ enqueue system event และปลุก heartbeat ได้แบบไม่บังคับ (--wake now หรือ --wake next-heartbeat) system events เหล่านั้นจะไม่ขยาย daily/idle reset freshness สำหรับ target session jobs แบบ Isolated จะรัน agent turn เฉพาะด้วย session ใหม่ Custom sessions (session:xxx) จะคง context ข้าม runs ทำให้ workflows เช่น daily standups ที่ต่อยอดจาก summaries ก่อนหน้าเป็นไปได้
'fresh session' หมายถึงอะไรสำหรับ isolated jobs
สำหรับ isolated jobs, "fresh session" หมายถึง transcript/session id ใหม่สำหรับแต่ละ run OpenClaw อาจนำ preferences ที่ปลอดภัยมาด้วย เช่น thinking/fast/verbose settings, labels และ explicit user-selected model/auth overrides แต่จะไม่สืบทอด ambient conversation context จาก cron row เก่า: channel/group routing, send or queue policy, elevation, origin หรือ ACP runtime binding ใช้ current หรือ session:<id> เมื่อ recurring job ควรจงใจต่อยอดจาก conversation context เดิม
Runtime cleanup
สำหรับ isolated jobs, runtime teardown ตอนนี้รวม best-effort browser cleanup สำหรับ cron session นั้น Cleanup failures จะถูกเพิกเฉยเพื่อให้ผลลัพธ์ cron จริงยังเป็นตัวตัดสิน
การรัน cron แบบ isolated ยัง dispose bundled MCP runtime instances ใด ๆ ที่ถูกสร้างสำหรับ job ผ่าน shared runtime-cleanup path ด้วย ซึ่งสอดคล้องกับวิธี teardown MCP clients ของ main-session และ custom-session เพื่อให้ isolated cron jobs ไม่ leak stdio child processes หรือ MCP connections ที่มีอายุยาวข้าม runs
Subagent และการส่งมอบ Discord
เมื่อการรัน cron แบบ isolated orchestrate subagents การส่งมอบจะเลือก final descendant output เหนือ stale parent interim text ด้วย หาก descendants ยังรันอยู่ OpenClaw จะ suppress partial parent update นั้นแทนที่จะประกาศออกไป
สำหรับ text-only Discord announce targets, OpenClaw จะส่ง canonical final assistant text หนึ่งครั้งแทนที่จะ replay ทั้ง streamed/intermediate text payloads และ final answer Media และ structured Discord payloads ยังถูกส่งเป็น payloads แยกต่างหากเพื่อไม่ให้ attachments และ components หายไป
ตัวเลือก payload สำหรับ isolated jobs
--messagestringrequiredข้อความ prompt (จำเป็นสำหรับ isolated)
--modelstringModel override; ใช้ selected allowed model สำหรับ job
--thinkingstringThinking level override
--light-contextbooleanข้าม workspace bootstrap file injection
--toolsstringจำกัด tools ที่ job ใช้ได้ เช่น --tools exec,read
--model ใช้ selected allowed model เป็น primary model ของ job นั้น ไม่เหมือนกับ chat-session /model override: configured fallback chains ยังคงมีผลเมื่อ job primary ล้มเหลว หาก requested model ไม่ได้รับอนุญาตหรือ resolve ไม่ได้ cron จะทำให้ run ล้มเหลวด้วย explicit validation error แทนที่จะ fallback ไปยัง agent/default model selection ของ job แบบเงียบ ๆ
Cron jobs ยังสามารถมี payload-level fallbacks ได้ด้วย เมื่อมีอยู่ list นั้นจะแทนที่ configured fallback chain สำหรับ job ใช้ fallbacks: [] ใน job payload/API เมื่อคุณต้องการ strict cron run ที่ลองเฉพาะ selected model หาก job มี --model แต่ไม่มีทั้ง payload fallbacks และ configured fallbacks OpenClaw จะส่ง explicit empty fallback override เพื่อไม่ให้ agent primary ถูกต่อท้ายเป็น hidden extra retry target
ลำดับความสำคัญของการเลือก model สำหรับ isolated jobs คือ:
- Gmail hook model override (เมื่อ run มาจาก Gmail และ override นั้นได้รับอนุญาต)
- Per-job payload
model - User-selected stored cron session model override
- Agent/default model selection
Fast mode จะตาม resolved live selection ด้วย หาก selected model config มี params.fastMode, isolated cron จะใช้ค่านั้นตามค่าเริ่มต้น Stored session fastMode override ยังชนะ config ได้ทั้งสองทิศทาง
หาก isolated run เจอ live model-switch handoff, cron จะ retry ด้วย switched provider/model และ persist live selection นั้นสำหรับ active run ก่อน retry เมื่อ switch นั้นมี auth profile ใหม่มาด้วย cron จะ persist auth profile override นั้นสำหรับ active run ด้วย Retries ถูกจำกัด: หลังจาก initial attempt บวก switch retries 2 ครั้ง cron จะ abort แทนที่จะวน loop ตลอดไป
ก่อนที่การรัน Cron แบบแยกจะเข้าสู่ agent runner, OpenClaw จะตรวจสอบ endpoint ของ local provider ที่เข้าถึงได้สำหรับ provider ที่กำหนดค่าเป็น api: "ollama" และ api: "openai-completions" ซึ่งมี baseUrl เป็น loopback, private-network หรือ .local หาก endpoint นั้นหยุดทำงาน การรันจะถูกบันทึกเป็น skipped พร้อมข้อผิดพลาด provider/model ที่ชัดเจนแทนที่จะเริ่มการเรียก model ผลลัพธ์ของ endpoint จะถูกแคชไว้ 5 นาที ดังนั้นงานที่ถึงกำหนดจำนวนมากซึ่งใช้เซิร์ฟเวอร์ local Ollama, vLLM, SGLang หรือ LM Studio เดียวกันที่หยุดทำงาน จะใช้ probe ขนาดเล็กร่วมกันหนึ่งครั้งแทนที่จะสร้าง request storm การรัน provider-preflight ที่ถูกข้ามจะไม่เพิ่ม execution-error backoff; เปิดใช้ failureAlert.includeSkipped เมื่อต้องการการแจ้งเตือนการข้ามซ้ำ ๆ
การส่งมอบและเอาต์พุต
| โหมด | สิ่งที่เกิดขึ้น |
|---|---|
announce |
ส่งข้อความสุดท้ายแบบ fallback ไปยังเป้าหมายหาก agent ไม่ได้ส่ง |
webhook |
POST payload เหตุการณ์ที่เสร็จสิ้นไปยัง URL |
none |
ไม่มีการส่งมอบ fallback จาก runner |
ใช้ --announce --channel telegram --to "-1001234567890" สำหรับการส่งไปยังช่องทาง สำหรับหัวข้อฟอรัม Telegram ให้ใช้ -1001234567890:topic:123; ผู้เรียกผ่าน RPC/config โดยตรงยังสามารถส่ง delivery.threadId เป็นสตริงหรือตัวเลขได้ด้วย เป้าหมาย Slack/Discord/Mattermost ควรใช้ prefix ที่ชัดเจน (channel:<id>, user:<id>) ID ห้อง Matrix แยกตัวพิมพ์เล็กใหญ่; ใช้ ID ห้องที่ตรงกันทุกตัวอักษรหรือรูปแบบ room:!room:server จาก Matrix
เมื่อการส่งแบบ announce ใช้ channel: "last" หรือละเว้น channel เป้าหมายที่มี prefix ของ provider เช่น telegram:123 สามารถเลือกช่องทางก่อนที่ Cron จะ fallback ไปยังประวัติ session หรือช่องทางเดียวที่กำหนดค่าไว้ เฉพาะ prefix ที่ Plugin ที่โหลดประกาศไว้เท่านั้นที่เป็นตัวเลือก provider หาก delivery.channel ถูกระบุอย่างชัดเจน prefix ของเป้าหมายต้องระบุ provider เดียวกัน เช่น channel: "whatsapp" พร้อม to: "telegram:123" จะถูกปฏิเสธแทนที่จะปล่อยให้ WhatsApp ตีความ Telegram ID เป็นหมายเลขโทรศัพท์ prefix สำหรับชนิดเป้าหมายและบริการ เช่น channel:<id>, user:<id>, imessage:<handle> และ sms:<number> ยังคงเป็นไวยากรณ์เป้าหมายที่ช่องทางเป็นเจ้าของ ไม่ใช่ตัวเลือก provider
สำหรับงานแบบแยก การส่งแชทจะถูกใช้ร่วมกัน หากมีเส้นทางแชทพร้อมใช้งาน agent สามารถใช้เครื่องมือ message ได้แม้งานจะใช้ --no-deliver หาก agent ส่งไปยังเป้าหมายที่กำหนดค่าไว้/ปัจจุบัน OpenClaw จะข้าม fallback announce มิฉะนั้น announce, webhook และ none จะควบคุมเฉพาะสิ่งที่ runner ทำกับการตอบกลับสุดท้ายหลังจากรอบ agent เท่านั้น
เมื่อ agent สร้าง reminder แบบแยกจากแชทที่ใช้งานอยู่ OpenClaw จะจัดเก็บเป้าหมายการส่งแบบสดที่เก็บรักษาไว้สำหรับเส้นทาง fallback announce คีย์ session ภายในอาจเป็นตัวพิมพ์เล็ก; เป้าหมายการส่งของ provider จะไม่ถูกสร้างใหม่จากคีย์เหล่านั้นเมื่อมีบริบทแชทปัจจุบันพร้อมใช้งาน
การส่ง announce แบบแฝงใช้ allowlist ของช่องทางที่กำหนดค่าไว้เพื่อตรวจสอบและเปลี่ยนเส้นทางเป้าหมายที่ล้าสมัย การอนุมัติจาก DM pairing-store ไม่ใช่ผู้รับ fallback automation; ตั้งค่า delivery.to หรือกำหนดค่ารายการ allowFrom ของช่องทางเมื่อ scheduled job ควรส่งไปยัง DM เชิงรุก
การแจ้งเตือนความล้มเหลวใช้เส้นทางปลายทางแยกต่างหาก:
cron.failureDestinationตั้งค่า default ส่วนกลางสำหรับการแจ้งเตือนความล้มเหลวjob.delivery.failureDestinationoverride ค่านั้นต่อ job- หากไม่ได้ตั้งค่าทั้งสองอย่างและ job ส่งผ่าน
announceอยู่แล้ว ตอนนี้การแจ้งเตือนความล้มเหลวจะ fallback ไปยังเป้าหมาย announce หลักนั้น delivery.failureDestinationรองรับเฉพาะ job ที่เป็นsessionTarget="isolated"เว้นแต่โหมดการส่งหลักจะเป็นwebhookfailureAlert.includeSkipped: trueเลือกให้ job หรือนโยบายแจ้งเตือน Cron ส่วนกลางรับการแจ้งเตือน skipped-run ซ้ำ ๆ การรันที่ถูกข้ามจะเก็บตัวนับการข้ามต่อเนื่องแยกต่างหาก จึงไม่กระทบ execution-error backoff
ตัวอย่าง CLI
Reminder แบบครั้งเดียว
openclaw cron add \ --name "Calendar check" \ --at "20m" \ --session main \ --system-event "Next heartbeat: check calendar." \ --wake nowJob แบบแยกที่ทำซ้ำ
openclaw cron add \ --name "Morning brief" \ --cron "0 7 * * *" \ --tz "America/Los_Angeles" \ --session isolated \ --message "Summarize overnight updates." \ --announce \ --channel slack \ --to "channel:C1234567890"Override model และการคิด
openclaw cron add \ --name "Deep analysis" \ --cron "0 6 * * 1" \ --tz "America/Los_Angeles" \ --session isolated \ --message "Weekly deep analysis of project progress." \ --model "opus" \ --thinking high \ --announceWebhook
Gateway สามารถเปิดเผย endpoint HTTP Webhook สำหรับ trigger ภายนอกได้ เปิดใช้ใน config:
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", },}การยืนยันตัวตน
ทุก request ต้องมี hook token ผ่าน header:
Authorization: Bearer <token>(แนะนำ)x-openclaw-token: <token>
token ใน query string จะถูกปฏิเสธ
POST /hooks/wake
เพิ่ม system event เข้าคิวสำหรับ session หลัก:
curl -X POST http://127.0.0.1:18789/hooks/wake \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"text":"New email received","mode":"now"}'textstringrequiredคำอธิบายเหตุการณ์
modestringdefault: nownow หรือ next-heartbeat
POST /hooks/agent
รันรอบ agent แบบแยก:
curl -X POST http://127.0.0.1:18789/hooks/agent \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"message":"Summarize inbox","name":"Email","model":"openai/gpt-5.4"}'ฟิลด์: message (จำเป็น), name, agentId, wakeMode, deliver, channel, to, model, fallbacks, thinking, timeoutSeconds
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSJIb29rIOC4l-C4teC5iOC5geC4oeC4m-C5hOC4p-C5iSAoUE9TVCAvaG9va3MvPG5hbWU
)">
ชื่อ hook แบบกำหนดเองจะถูก resolve ผ่าน hooks.mappings ใน config Mapping สามารถแปลง payload ใด ๆ เป็น action wake หรือ agent ด้วย template หรือ code transform
การผสานรวม Gmail PubSub
เชื่อม trigger inbox ของ Gmail เข้ากับ OpenClaw ผ่าน Google PubSub
การตั้งค่าด้วย wizard (แนะนำ)
openclaw webhooks gmail setup --account [email protected]คำสั่งนี้เขียน config hooks.gmail, เปิดใช้ preset Gmail และใช้ Tailscale Funnel สำหรับ push endpoint
การเริ่ม Gateway อัตโนมัติ
เมื่อ hooks.enabled=true และตั้งค่า hooks.gmail.account แล้ว Gateway จะเริ่ม gog gmail watch serve ตอน boot และต่ออายุ watch อัตโนมัติ ตั้งค่า OPENCLAW_SKIP_GMAIL_WATCHER=1 เพื่อเลือกไม่ใช้
การตั้งค่าแบบครั้งเดียวด้วยตนเอง
เลือกโปรเจกต์ GCP
เลือกโปรเจกต์ GCP ที่เป็นเจ้าของ OAuth client ที่ gog ใช้:
gcloud auth logingcloud config set project <project-id>gcloud services enable gmail.googleapis.com pubsub.googleapis.comสร้าง topic และให้สิทธิ์ Gmail push access
gcloud pubsub topics create gog-gmail-watchgcloud pubsub topics add-iam-policy-binding gog-gmail-watch \ --member=serviceAccount:[email protected] \ --role=roles/pubsub.publisherเริ่ม watch
gog gmail watch start \ --account [email protected] \ --label INBOX \ --topic projects/<project-id>/topics/gog-gmail-watchOverride model สำหรับ Gmail
{ hooks: { gmail: { model: "openrouter/meta-llama/llama-3.3-70b-instruct:free", thinking: "off", }, },}การจัดการ job
# List all jobsopenclaw cron list # Get one stored job as JSONopenclaw cron get <jobId> # Show one job, including resolved delivery routeopenclaw cron show <jobId> # Edit a jobopenclaw cron edit <jobId> --message "Updated prompt" --model "opus" # Force run a job nowopenclaw cron run <jobId> # Run only if dueopenclaw cron run <jobId> --due # View run historyopenclaw cron runs --id <jobId> --limit 50 # Delete a jobopenclaw cron remove <jobId> # Agent selection (multi-agent setups)openclaw cron add --name "Ops sweep" --cron "0 6 * * *" --session isolated --message "Check ops queue" --agent opsopenclaw cron edit <jobId> --clear-agentการกำหนดค่า
{ cron: { enabled: true, store: "~/.openclaw/cron/jobs.json", maxConcurrentRuns: 1, retry: { maxAttempts: 3, backoffMs: [60000, 120000, 300000], retryOn: ["rate_limit", "overloaded", "network", "server_error"], }, webhookToken: "replace-with-dedicated-webhook-token", sessionRetention: "24h", runLog: { maxBytes: "2mb", keepLines: 2000 }, },}maxConcurrentRuns จำกัดทั้ง scheduled cron dispatch และการทำงานของ agent-turn แบบแยก agent turn ของ Cron แบบแยกใช้ lane การทำงานเฉพาะของคิวที่ชื่อ cron-nested ภายใน ดังนั้นการเพิ่มค่านี้จะทำให้การรัน Cron LLM อิสระคืบหน้าแบบขนานแทนที่จะเริ่มเฉพาะ wrapper Cron ชั้นนอก lane nested ที่ไม่ใช่ Cron และใช้ร่วมกันจะไม่ถูกขยายด้วยการตั้งค่านี้
state sidecar ตอน runtime ได้มาจาก cron.store: store แบบ .json เช่น ~/clawd/cron/jobs.json ใช้ ~/clawd/cron/jobs-state.json ส่วน path ของ store ที่ไม่มี suffix .json จะต่อท้ายด้วย -state.json
หากคุณแก้ไข jobs.json ด้วยมือ ให้เก็บ jobs-state.json ออกจาก source control OpenClaw ใช้ sidecar นั้นสำหรับ slot ที่ pending, marker ที่ active, metadata ของการรันล่าสุด และ schedule identity ที่บอก scheduler ว่า job ที่ถูกแก้ไขจากภายนอกต้องมี nextRunAtMs ใหม่
ปิดใช้ Cron: cron.enabled: false หรือ OPENCLAW_SKIP_CRON=1
พฤติกรรม retry
Retry แบบครั้งเดียว: ข้อผิดพลาดชั่วคราว (rate limit, overload, network, server error) จะ retry สูงสุด 3 ครั้งพร้อม exponential backoff ข้อผิดพลาดถาวรจะปิดใช้ทันที
Retry แบบ recurring: exponential backoff (30s ถึง 60m) ระหว่าง retry Backoff จะรีเซ็ตหลังจากการรันที่สำเร็จครั้งถัดไป
การบำรุงรักษา
cron.sessionRetention (ค่าเริ่มต้น 24h) ล้างรายการเซสชันการรันแบบแยกส่วน cron.runLog.maxBytes / cron.runLog.keepLines ล้างไฟล์บันทึกการรันโดยอัตโนมัติ
การแก้ไขปัญหา
ลำดับคำสั่ง
openclaw statusopenclaw gateway statusopenclaw cron statusopenclaw cron listopenclaw cron runs --id <jobId> --limit 20openclaw system heartbeat lastopenclaw logs --followopenclaw doctorCron ไม่ทำงาน
- ตรวจสอบ
cron.enabledและตัวแปรสภาพแวดล้อมOPENCLAW_SKIP_CRON - ยืนยันว่า Gateway ทำงานอย่างต่อเนื่อง
- สำหรับกำหนดการ
cronให้ตรวจสอบเขตเวลา (--tz) เทียบกับเขตเวลาของโฮสต์ reason: not-dueในเอาต์พุตการรันหมายความว่าการรันด้วยตนเองถูกตรวจสอบด้วยopenclaw cron run <jobId> --dueและงานยังไม่ถึงกำหนด
Cron ทำงานแล้วแต่ไม่มีการส่งมอบ
- โหมดการส่งมอบ
noneหมายความว่าไม่คาดว่าจะมีการส่งสำรองจากรันเนอร์ เอเจนต์ยังสามารถส่งโดยตรงด้วยเครื่องมือmessageได้เมื่อมีเส้นทางแชต - เป้าหมายการส่งมอบขาดหายหรือไม่ถูกต้อง (
channel/to) หมายความว่าการส่งออกถูกข้ามไป - สำหรับ Matrix งานที่คัดลอกมาหรืองานเดิมที่มี ID ห้อง
delivery.toเป็นตัวพิมพ์เล็กอาจล้มเหลว เพราะ ID ห้องของ Matrix แยกแยะตัวพิมพ์ใหญ่และเล็ก แก้ไขงานให้เป็นค่า!room:serverหรือroom:!room:serverที่ตรงกันจาก Matrix - ข้อผิดพลาดการยืนยันตัวตนของช่องทาง (
unauthorized,Forbidden) หมายความว่าการส่งมอบถูกบล็อกโดยข้อมูลประจำตัว - หากการรันแบบแยกส่วนส่งกลับเฉพาะโทเค็นเงียบ (
NO_REPLY/no_reply) OpenClaw จะระงับการส่งออกโดยตรง และยังระงับเส้นทางสรุปสำรองที่เข้าคิวไว้ด้วย ดังนั้นจึงไม่มีสิ่งใดถูกโพสต์กลับไปยังแชต - หากเอเจนต์ควรส่งข้อความถึงผู้ใช้เอง ให้ตรวจสอบว่างานมีเส้นทางที่ใช้ได้ (
channel: "last"พร้อมแชตก่อนหน้า หรือช่องทาง/เป้าหมายที่ระบุอย่างชัดเจน)
Cron หรือ Heartbeat ดูเหมือนจะขัดขวางการเปลี่ยนรอบ /new-style
- ความสดใหม่ของการรีเซ็ตรายวันและเมื่อไม่ได้ใช้งานไม่ได้อิงกับ
updatedAt; ดู การจัดการเซสชัน - การปลุกของ Cron, การรัน Heartbeat, การแจ้งเตือน exec และการทำบัญชีของ Gateway อาจอัปเดตแถวเซสชันสำหรับการกำหนดเส้นทาง/สถานะ แต่จะไม่ขยาย
sessionStartedAtหรือlastInteractionAt - สำหรับแถวเดิมที่สร้างก่อนมีฟิลด์เหล่านั้น OpenClaw สามารถกู้คืน
sessionStartedAtจากส่วนหัวเซสชันของทรานสคริปต์ JSONL ได้เมื่อไฟล์ยังพร้อมใช้งาน แถวเดิมที่ไม่ได้ใช้งานซึ่งไม่มีlastInteractionAtจะใช้เวลาเริ่มต้นที่กู้คืนได้นั้นเป็นค่าฐานเมื่อไม่ได้ใช้งาน
ข้อควรระวังเกี่ยวกับเขตเวลา
- Cron ที่ไม่มี
--tzจะใช้เขตเวลาของโฮสต์ Gateway - กำหนดการ
atที่ไม่มีเขตเวลาจะถือว่าเป็น UTC activeHoursของ Heartbeat ใช้การแก้ค่าเขตเวลาที่กำหนดค่าไว้
ที่เกี่ยวข้อง
- ระบบอัตโนมัติ — กลไกระบบอัตโนมัติทั้งหมดโดยสรุป
- งานเบื้องหลัง — บัญชีแยกประเภทรายการงานสำหรับการดำเนินการ cron
- Heartbeat — เทิร์นเซสชันหลักตามรอบเวลา
- เขตเวลา — การกำหนดค่าเขตเวลา