Automation
งานที่กำหนดเวลาไว้
Cron คือ Scheduler ในตัวของ Gateway โดยจะคงอยู่ของงาน ปลุก Agent ในเวลาที่เหมาะสม และสามารถส่งผลลัพธ์กลับไปยังช่องทางแชตหรือปลายทาง Webhook ได้
เริ่มต้นอย่างรวดเร็ว
เพิ่มการแจ้งเตือนแบบครั้งเดียว
openclaw cron create "2026-02-01T16:00:00Z" \ --name "Reminder" \ --session main \ --system-event "Reminder: check the cron docs draft" \ --wake now \ --delete-after-runตรวจสอบงานของคุณ
openclaw cron listopenclaw cron get <job-id>openclaw cron show <job-id>ดูประวัติการรัน
openclaw cron runs --id <job-id>cron ทำงานอย่างไร
- Cron ทำงาน ภายในกระบวนการ Gateway (ไม่ใช่ภายในโมเดล)
- นิยามงาน สถานะขณะรัน และประวัติการรันจะคงอยู่ในฐานข้อมูลสถานะ SQLite ที่ใช้ร่วมกันของ OpenClaw เพื่อให้การรีสตาร์ตไม่ทำให้กำหนดการสูญหาย
- เมื่ออัปเกรด ให้รัน
openclaw doctor --fixเพื่อนำเข้าไฟล์เดิม~/.openclaw/cron/jobs.json,jobs-state.jsonและruns/*.jsonlเข้าสู่ SQLite และเปลี่ยนชื่อไฟล์เหล่านั้นด้วยส่วนต่อท้าย.migratedแถวงานที่มีรูปแบบผิดจะถูกข้ามจาก runtime และคัดลอกไปยังjobs-quarantine.jsonเพื่อซ่อมแซมหรือตรวจสอบภายหลัง cron.storeยังคงระบุคีย์ที่เก็บ cron เชิงตรรกะและเส้นทางนำเข้าของ doctor หลังจากนำเข้าแล้ว การแก้ไขไฟล์ JSON นั้นจะไม่เปลี่ยนงาน cron ที่ใช้งานอยู่อีกต่อไป ให้ใช้openclaw cron add|edit|removeหรือเมธอด RPC ของ Gateway cron แทน- การดำเนินการ cron ทั้งหมดจะสร้างระเบียน งานเบื้องหลัง
- เมื่อ Gateway เริ่มทำงาน งาน agent-turn แบบแยกที่เลยกำหนดจะถูกจัดกำหนดการใหม่ให้อยู่นอกช่วงเชื่อมต่อช่องทาง แทนที่จะเล่นซ้ำทันที เพื่อให้การเริ่มต้น Discord/Telegram และการตั้งค่าคำสั่งเนทีฟยังตอบสนองได้ดีหลังรีสตาร์ต
- งานแบบครั้งเดียว (
--at) จะลบตัวเองโดยอัตโนมัติหลังสำเร็จตามค่าเริ่มต้น - การรัน cron แบบแยกจะพยายามปิดแท็บ/กระบวนการเบราว์เซอร์ที่ติดตามไว้สำหรับเซสชัน
cron:<jobId>ของตนเมื่อการรันเสร็จสิ้น เพื่อไม่ให้ระบบอัตโนมัติของเบราว์เซอร์ที่แยกออกมาทิ้งกระบวนการกำพร้าไว้ - การรัน cron แบบแยกที่ได้รับสิทธิ์การล้างตัวเองของ cron แบบจำกัดยังสามารถอ่านสถานะ Scheduler รายการงานปัจจุบันของตนเองที่ถูกกรองเฉพาะตน และประวัติการรันของงานนั้นได้ เพื่อให้การตรวจสอบสถานะ/Heartbeat สามารถตรวจสอบกำหนดการของตนเองได้โดยไม่ต้องได้รับสิทธิ์กลายพันธุ์ cron ที่กว้างกว่า
- การรัน cron แบบแยกยังป้องกันการตอบรับที่ค้างเก่า หากผลลัพธ์แรกเป็นเพียงการอัปเดตสถานะชั่วคราว (
on it,pulling everything togetherและคำใบ้คล้ายกัน) และไม่มีการรัน Subagent ลูกหลานที่ยังรับผิดชอบคำตอบสุดท้าย OpenClaw จะ prompt ใหม่หนึ่งครั้งเพื่อขอผลลัพธ์จริงก่อนส่งมอบ - การรัน cron แบบแยกใช้ metadata การปฏิเสธการดำเนินการแบบมีโครงสร้างจากการรันที่ฝังอยู่ รวมถึง wrapper
UNAVAILABLEของ node-host ซึ่งข้อความแสดงข้อผิดพลาดที่ซ้อนอยู่ขึ้นต้นด้วยSYSTEM_RUN_DENIEDหรือINVALID_REQUESTเพื่อไม่ให้คำสั่งที่ถูกบล็อกรายงานเป็นการรันสีเขียว ขณะที่ข้อความร้อยแก้วทั่วไปของ Assistant จะไม่ถูกถือเป็นการปฏิเสธ - การรัน cron แบบแยกยังถือว่าความล้มเหลวของ Agent ระดับการรันเป็นข้อผิดพลาดของงาน แม้จะไม่มี payload ตอบกลับก็ตาม เพื่อให้ความล้มเหลวของโมเดล/Provider เพิ่มตัวนับข้อผิดพลาดและทริกเกอร์การแจ้งเตือนความล้มเหลว แทนที่จะล้างงานว่าเสร็จสำเร็จ
- เมื่องาน agent-turn แบบแยกถึง
timeoutSecondscron จะยกเลิกการรัน Agent ที่อยู่เบื้องล่างและให้ช่วงเวลาล้างข้อมูลสั้น ๆ หากการรันไม่ระบายงานออก การล้างข้อมูลที่ Gateway เป็นเจ้าของจะบังคับล้างความเป็นเจ้าของเซสชันของการรันนั้นก่อนที่ cron จะบันทึก timeout เพื่อไม่ให้งานแชตที่เข้าคิวค้างอยู่หลังเซสชันประมวลผลที่ค้างเก่า - หาก agent-turn แบบแยกหยุดค้างก่อน runner เริ่มหรือก่อนการเรียกโมเดลครั้งแรก cron จะบันทึก timeout เฉพาะเฟส เช่น
setup timed out before runner startหรือstalled before first model call (last phase: context-engine)Watchdog เหล่านี้ครอบคลุม Provider แบบฝังและ Provider ที่อิง CLI ก่อนที่กระบวนการ CLI ภายนอกจะเริ่มจริง และมีเพดานแยกจากค่าtimeoutSecondsที่ยาว เพื่อให้ความล้มเหลวของ cold-start/auth/context ปรากฏอย่างรวดเร็วแทนที่จะรอครบงบเวลาทั้งหมดของงาน - หากคุณใช้ system cron หรือ Scheduler ภายนอกอื่นเพื่อรัน
openclaw agentให้ครอบด้วยการยกระดับ hard-kill แม้ว่า CLI จะจัดการSIGTERM/SIGINTแล้วก็ตาม การรันที่อิง Gateway จะขอให้ Gateway ยกเลิกการรันที่รับแล้ว ส่วนการรัน fallback แบบ local และแบบฝังจะได้รับสัญญาณยกเลิกเดียวกัน สำหรับ GNUtimeoutให้ใช้timeout -k 60 600 openclaw agent ...แทนtimeout 600 ...แบบธรรมดา ค่า-kคือ backstop ของ supervisor หากกระบวนการไม่สามารถระบายงานออกได้ สำหรับ unit ของ systemd ให้คงรูปแบบเดียวกันโดยใช้สัญญาณหยุดSIGTERMพร้อมช่วงผ่อนผัน เช่นTimeoutStopSecก่อนการ kill สุดท้าย หากการลองซ้ำใช้--run-idเดิมในขณะที่การรัน Gateway เดิมยังทำงานอยู่ รายการซ้ำจะถูกรายงานว่าอยู่ระหว่างดำเนินการแทนที่จะเริ่มการรันที่สอง
ประเภทกำหนดการ
| ชนิด | flag ของ CLI | คำอธิบาย |
|---|---|---|
at |
--at |
timestamp แบบครั้งเดียว (ISO 8601 หรือแบบสัมพันธ์ เช่น 20m) |
every |
--every |
ช่วงเวลาคงที่ |
cron |
--cron |
นิพจน์ cron แบบ 5 ฟิลด์หรือ 6 ฟิลด์ พร้อม --tz ที่ไม่บังคับ |
Timestamp ที่ไม่มี timezone จะถือเป็น UTC เพิ่ม --tz America/New_York สำหรับการจัดกำหนดการตามเวลานาฬิกาท้องถิ่น
นิพจน์แบบเกิดซ้ำที่ต้นชั่วโมงจะถูกกระจายเวลาโดยอัตโนมัติสูงสุด 5 นาทีเพื่อลด spike ของโหลด ใช้ --exact เพื่อบังคับเวลาให้แม่นยำ หรือ --stagger 30s สำหรับหน้าต่างเวลาที่ระบุชัดเจน
day-of-month และ day-of-week ใช้ตรรกะ OR
นิพจน์ Cron ถูก parse โดย croner เมื่อทั้งฟิลด์ day-of-month และ day-of-week ไม่ใช่ wildcard croner จะ match เมื่อฟิลด์ ใดฟิลด์หนึ่ง match ไม่ใช่ทั้งสองฟิลด์ นี่คือพฤติกรรม cron มาตรฐานของ Vixie
# 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การตั้งค่านี้จะทำงานประมาณ 5-6 ครั้งต่อเดือน แทนที่จะเป็น 0-1 ครั้งต่อเดือน OpenClaw ใช้พฤติกรรม OR ค่าเริ่มต้นของ Croner ที่นี่ หากต้องการบังคับให้ต้องตรงทั้งสองเงื่อนไข ให้ใช้ modifier day-of-week + ของ Croner (0 9 15 * +1) หรือจัดกำหนดการบนฟิลด์หนึ่งแล้ว guard อีกฟิลด์ใน prompt หรือคำสั่งของงาน
รูปแบบการดำเนินการ
| รูปแบบ | ค่า --session |
รันใน | เหมาะที่สุดสำหรับ |
|---|---|---|---|
| เซสชันหลัก | main |
lane ปลุก cron เฉพาะ | การแจ้งเตือน, เหตุการณ์ระบบ |
| แบบแยก | isolated |
cron:<jobId> เฉพาะ |
รายงาน, งานเบื้องหลัง |
| เซสชันปัจจุบัน | current |
ผูกเมื่อสร้าง | งานที่เกิดซ้ำและรับรู้บริบท |
| เซสชันกำหนดเอง | session:custom-id |
เซสชันมีชื่อที่คงอยู่ | Workflow ที่ต่อยอดจากประวัติ |
เซสชันหลัก เทียบกับแบบแยก เทียบกับแบบกำหนดเอง
งาน เซสชันหลัก จะ enqueue เหตุการณ์ระบบเข้าไปใน lane การรันที่ cron เป็นเจ้าของ และปลุก Heartbeat ได้ตามตัวเลือก (--wake now หรือ --wake next-heartbeat) งานเหล่านี้สามารถใช้บริบทการส่งมอบล่าสุดของเซสชันหลักเป้าหมายสำหรับการตอบกลับได้ แต่จะไม่ผนวก turn ของ cron ตามปกติเข้ากับ lane แชตของมนุษย์ และจะไม่ต่ออายุความสดของการรีเซ็ตรายวัน/เมื่อ idle สำหรับเซสชันเป้าหมาย งาน แบบแยก จะรัน agent turn เฉพาะพร้อมเซสชันใหม่ เซสชันกำหนดเอง (session:xxx) จะคงบริบทข้ามการรัน ทำให้ Workflow เช่น daily standup ที่ต่อยอดจากสรุปก่อนหน้าเป็นไปได้
เหตุการณ์ cron ของเซสชันหลักเป็นการแจ้งเตือน system-event ที่สมบูรณ์ในตัวเอง เหตุการณ์เหล่านี้
จะไม่รวมคำสั่ง "Read
HEARTBEAT.md" ของ prompt Heartbeat ค่าเริ่มต้นโดยอัตโนมัติ หากการแจ้งเตือนแบบเกิดซ้ำควร consult
HEARTBEAT.md ให้ระบุเรื่องนั้นอย่างชัดเจนในข้อความเหตุการณ์ cron หรือใน
คำสั่งของ Agent เอง
ความหมายของ 'เซสชันใหม่' สำหรับงานแบบแยก
สำหรับงานแบบแยก "เซสชันใหม่" หมายถึง transcript/session id ใหม่สำหรับแต่ละการรัน OpenClaw อาจนำค่ากำหนดที่ปลอดภัยติดไปด้วย เช่น การตั้งค่า thinking/fast/verbose, labels และการ override โมเดล/auth ที่ผู้ใช้เลือกอย่างชัดเจน แต่จะไม่สืบทอดบริบทการสนทนาแวดล้อมจากแถว cron เก่า: การ route ช่องทาง/กลุ่ม, นโยบายส่งหรือคิว, elevation, origin หรือการ binding runtime ของ ACP ใช้ current หรือ session:<id> เมื่องานเกิดซ้ำควรตั้งใจต่อยอดจากบริบทการสนทนาเดียวกัน
การล้างข้อมูล runtime
สำหรับงานแบบแยก teardown ของ runtime ตอนนี้รวมการพยายามล้างข้อมูลเบราว์เซอร์สำหรับเซสชัน cron นั้นด้วย ความล้มเหลวในการล้างข้อมูลจะถูกละเว้นเพื่อให้ผลลัพธ์ cron จริงยังเป็นตัวตัดสิน
การรัน cron แบบแยกยัง dispose instance runtime ของ MCP ที่ bundle มาและถูกสร้างสำหรับงานผ่านเส้นทาง runtime-cleanup ที่ใช้ร่วมกัน วิธีนี้ตรงกับการ teardown ไคลเอนต์ MCP ของเซสชันหลักและเซสชันกำหนดเอง ดังนั้นงาน cron แบบแยกจะไม่รั่วกระบวนการลูก stdio หรือการเชื่อมต่อ MCP อายุยาวข้ามการรัน
Subagent และการส่งมอบผ่าน Discord
เมื่อการรัน cron แบบแยก orchestrate Subagent การส่งมอบจะเลือก output สุดท้ายของลูกหลานมากกว่าข้อความชั่วคราวของ parent ที่ค้างเก่า หากลูกหลานยังรันอยู่ OpenClaw จะระงับการอัปเดต parent บางส่วนนั้นแทนการประกาศ
สำหรับเป้าหมายประกาศ Discord แบบข้อความเท่านั้น OpenClaw จะส่งข้อความ Assistant สุดท้ายตาม canonical เพียงครั้งเดียว แทนการเล่นซ้ำทั้ง payload ข้อความแบบ streamed/intermediate และคำตอบสุดท้าย สื่อและ payload Discord แบบมีโครงสร้างยังคงถูกส่งเป็น payload แยกต่างหาก เพื่อไม่ให้ attachment และ component ถูกทิ้ง
payload คำสั่ง
ใช้ payload คำสั่งสำหรับสคริปต์ deterministic ที่ควรรันภายใน Scheduler ของ Gateway โดยไม่ต้องเริ่ม agent turn แบบแยกที่อิงโมเดล งานคำสั่งจะดำเนินการบน host ของ Gateway จับ stdout/stderr บันทึกการรันในประวัติ cron และใช้โหมดการส่งมอบ announce, webhook และ none เดียวกับงานแบบแยก
openclaw cron create "*/15 * * * *" \ --name "Queue depth probe" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"--command <shell> จะเก็บ argv: ["sh", "-lc", <shell>] ใช้ --command-argv '["node","scripts/report.mjs"]' เมื่อคุณต้องการการดำเนินการ argv ที่แน่นอนโดยไม่มีการ parse ของ shell ฟิลด์เสริม --command-env KEY=VALUE, --command-input, --timeout-seconds, --no-output-timeout-seconds และ --output-max-bytes ควบคุม environment ของกระบวนการ, stdin และขอบเขต output
หาก stdout ไม่ว่าง ข้อความนั้นคือผลลัพธ์ที่ถูกส่งมอบ หาก stdout ว่างและ stderr ไม่ว่าง stderr จะถูกส่งมอบ หากมีทั้งสองสตรีม Cron จะส่งบล็อก stdout: / stderr: ขนาดเล็ก รหัสออกเป็นศูนย์จะบันทึกการรันเป็น ok; การออกที่ไม่เป็นศูนย์ สัญญาณ หมดเวลา หรือหมดเวลาเพราะไม่มีเอาต์พุต จะบันทึกเป็น error และสามารถทริกเกอร์การแจ้งเตือนความล้มเหลวได้ คำสั่งที่พิมพ์เฉพาะ NO_REPLY จะใช้การระงับโทเค็นเงียบตามปกติของ Cron และไม่โพสต์อะไรกลับไปยังแชต
ตัวเลือกเพย์โหลดสำหรับงานแบบแยก
--messagestringrequiredข้อความพรอมป์ (จำเป็นสำหรับแบบแยก)
--modelstringการแทนที่โมเดล; ใช้โมเดลที่อนุญาตที่เลือกไว้สำหรับงาน
--fallbacksstringรายการโมเดลสำรองต่อหนึ่งงาน เช่น --fallbacks openrouter/gpt-4.1-mini,openai/gpt-5 ส่ง --fallbacks "" สำหรับการรันแบบเข้มงวดที่ไม่มีโมเดลสำรอง
--clear-fallbacksbooleanเมื่อใช้กับ cron edit จะลบการแทนที่โมเดลสำรองต่อหนึ่งงาน เพื่อให้งานทำตามลำดับความสำคัญของโมเดลสำรองที่กำหนดค่าไว้ ไม่สามารถใช้ร่วมกับ --fallbacks
--clear-modelbooleanเมื่อใช้กับ cron edit จะลบการแทนที่โมเดลต่อหนึ่งงาน เพื่อให้งานทำตามลำดับความสำคัญการเลือกโมเดล Cron ตามปกติ (การแทนที่เซสชัน Cron ที่จัดเก็บไว้หากตั้งค่าไว้ มิฉะนั้นใช้โมเดลของเอเจนต์/ค่าเริ่มต้น) ไม่สามารถใช้ร่วมกับ --model
--thinkingstringการแทนที่ระดับการคิด
--clear-thinkingbooleanเมื่อใช้กับ cron edit จะลบการแทนที่การคิดต่อหนึ่งงาน เพื่อให้งานทำตามลำดับความสำคัญการคิดของ Cron ตามปกติ ไม่สามารถใช้ร่วมกับ --thinking
--light-contextbooleanข้ามการฉีดไฟล์บูตสแตรปเวิร์กสเปซ
--toolsstringจำกัดว่าเครื่องมือใดที่งานสามารถใช้ได้ เช่น --tools exec,read
--model ใช้โมเดลที่อนุญาตที่เลือกไว้เป็นโมเดลหลักของงานนั้น ไม่เหมือนกับการแทนที่ /model ของเซสชันแชต: เชนโมเดลสำรองที่กำหนดค่าไว้ยังคงใช้เมื่อโมเดลหลักของงานล้มเหลว หากโมเดลที่ร้องขอไม่ได้รับอนุญาตหรือไม่สามารถแก้ค่าได้ Cron จะทำให้การรันล้มเหลวพร้อมข้อผิดพลาดการตรวจสอบที่ชัดเจน แทนที่จะถอยกลับไปใช้การเลือกโมเดลของเอเจนต์/ค่าเริ่มต้นของงานอย่างเงียบ ๆ
งาน Cron ยังสามารถมี fallbacks ระดับเพย์โหลดได้ด้วย เมื่อมีอยู่ รายการนั้นจะแทนที่เชนโมเดลสำรองที่กำหนดค่าไว้สำหรับงาน ใช้ fallbacks: [] ในเพย์โหลด/API ของงานเมื่อคุณต้องการรัน Cron แบบเข้มงวดที่ลองเฉพาะโมเดลที่เลือก หากงานมี --model แต่ไม่มีโมเดลสำรองทั้งในเพย์โหลดหรือในการกำหนดค่า OpenClaw จะส่งการแทนที่โมเดลสำรองแบบว่างอย่างชัดเจน เพื่อไม่ให้โมเดลหลักของเอเจนต์ถูกผนวกเป็นเป้าหมายลองซ้ำเพิ่มเติมแบบซ่อนอยู่
การตรวจสอบล่วงหน้าของผู้ให้บริการภายในเครื่องจะไล่ตรวจโมเดลสำรองที่กำหนดค่าไว้ก่อนทำเครื่องหมายการรัน Cron เป็น skipped; fallbacks: [] ทำให้เส้นทางการตรวจสอบล่วงหน้านั้นยังคงเข้มงวด
ลำดับความสำคัญการเลือกโมเดลสำหรับงานแบบแยกคือ:
- การแทนที่โมเดลของฮุก Gmail (เมื่อการรันมาจาก Gmail และการแทนที่นั้นได้รับอนุญาต)
modelของเพย์โหลดต่อหนึ่งงาน- การแทนที่โมเดลเซสชัน Cron ที่ผู้ใช้เลือกและจัดเก็บไว้
- การเลือกโมเดลของเอเจนต์/ค่าเริ่มต้น
โหมดเร็วทำตามการเลือกแบบสดที่แก้ค่าได้เช่นกัน หากการกำหนดค่าโมเดลที่เลือกมี params.fastMode Cron แบบแยกจะใช้ค่านั้นโดยค่าเริ่มต้น การแทนที่ fastMode ของเซสชันที่จัดเก็บไว้ยังคงมีสิทธิ์เหนือการกำหนดค่าไม่ว่าจะเป็นทิศทางใด โหมดอัตโนมัติใช้ค่าตัด params.fastAutoOnSeconds ของโมเดลที่เลือกเมื่อมีอยู่ โดยมีค่าเริ่มต้นเป็น 60 วินาที
หากการรันแบบแยกเจอการส่งต่อการสลับโมเดลแบบสด Cron จะลองซ้ำด้วยผู้ให้บริการ/โมเดลที่ถูกสลับ และคงการเลือกแบบสดนั้นไว้สำหรับการรันที่ใช้งานอยู่ก่อนลองซ้ำ เมื่อการสลับนั้นพกโปรไฟล์การยืนยันตัวตนใหม่มาด้วย Cron จะคงการแทนที่โปรไฟล์การยืนยันตัวตนนั้นไว้สำหรับการรันที่ใช้งานอยู่เช่นกัน การลองซ้ำมีขอบเขต: หลังจากความพยายามครั้งแรกบวกการลองซ้ำจากการสลับ 2 ครั้ง Cron จะยกเลิกแทนที่จะวนซ้ำตลอดไป
ก่อนที่การรัน Cron แบบแยกจะเข้าสู่ตัวรันเอเจนต์ OpenClaw จะตรวจสอบเอนด์พอยต์ผู้ให้บริการภายในเครื่องที่เข้าถึงได้สำหรับผู้ให้บริการ api: "ollama" และ api: "openai-completions" ที่กำหนดค่าไว้ ซึ่ง baseUrl เป็น loopback, เครือข่ายส่วนตัว หรือ .local หากเอนด์พอยต์นั้นล่ม การรันจะถูกบันทึกเป็น skipped พร้อมข้อผิดพลาดผู้ให้บริการ/โมเดลที่ชัดเจน แทนที่จะเริ่มการเรียกโมเดล ผลลัพธ์เอนด์พอยต์จะถูกแคชไว้ 5 นาที ดังนั้นงานจำนวนมากที่ถึงกำหนดและใช้เซิร์ฟเวอร์ Ollama, vLLM, SGLang หรือ LM Studio ภายในเครื่องที่ล่มตัวเดียวกัน จะใช้โพรบขนาดเล็กร่วมกันหนึ่งครั้งแทนการสร้างพายุคำขอ การรันที่ถูกข้ามจากการตรวจสอบล่วงหน้าผู้ให้บริการจะไม่เพิ่ม backoff ของข้อผิดพลาดการดำเนินการ; เปิดใช้ failureAlert.includeSkipped เมื่อคุณต้องการการแจ้งเตือนการข้ามซ้ำ ๆ
การส่งมอบและเอาต์พุต
| โหมด | สิ่งที่เกิดขึ้น |
|---|---|
announce |
ส่งข้อความสุดท้ายแบบสำรองไปยังเป้าหมายหากเอเจนต์ไม่ได้ส่ง |
webhook |
POST เพย์โหลดเหตุการณ์ที่เสร็จแล้วไปยัง URL |
none |
ไม่มีการส่งมอบสำรองของตัวรัน |
ใช้ --announce --channel telegram --to "-1001234567890" สำหรับการส่งมอบไปยังช่องทาง สำหรับหัวข้อฟอรัม Telegram ให้ใช้ -1001234567890:topic:123; OpenClaw ยังยอมรับรูปแบบย่อ -1001234567890:123 ที่ Telegram เป็นเจ้าของ ผู้เรียก RPC/config โดยตรงอาจส่ง delivery.threadId เป็นสตริงหรือตัวเลข เป้าหมาย Slack/Discord/Mattermost ควรใช้คำนำหน้าที่ชัดเจน (channel:<id>, user:<id>) ID ห้อง Matrix คำนึงถึงตัวพิมพ์เล็กใหญ่; ใช้ ID ห้องที่ตรงเป๊ะหรือรูปแบบ room:!room:server จาก Matrix
เมื่อการส่งมอบประกาศใช้ channel: "last" หรือละ channel ไว้ เป้าหมายที่มีคำนำหน้าผู้ให้บริการ เช่น telegram:123 สามารถเลือกช่องทางก่อนที่ Cron จะถอยกลับไปใช้ประวัติเซสชันหรือช่องทางที่กำหนดค่าไว้เพียงช่องทางเดียว เฉพาะคำนำหน้าที่ Plugin ที่โหลดไว้ประกาศเท่านั้นที่เป็นตัวเลือกผู้ให้บริการ หาก delivery.channel ระบุชัดเจน คำนำหน้าเป้าหมายต้องระบุผู้ให้บริการเดียวกัน เช่น channel: "whatsapp" พร้อม to: "telegram:123" จะถูกปฏิเสธ แทนที่จะปล่อยให้ WhatsApp ตีความ ID Telegram เป็นหมายเลขโทรศัพท์ คำนำหน้าชนิดเป้าหมายและบริการ เช่น channel:<id>, user:<id>, imessage:<handle> และ sms:<number> ยังคงเป็นไวยากรณ์เป้าหมายที่ช่องทางเป็นเจ้าของ ไม่ใช่ตัวเลือกผู้ให้บริการ
สำหรับงานแบบแยก การส่งมอบแชตใช้ร่วมกัน หากมีเส้นทางแชต เอเจนต์สามารถใช้เครื่องมือ message ได้แม้งานจะใช้ --no-deliver หากเอเจนต์ส่งไปยังเป้าหมายที่กำหนดค่าไว้/ปัจจุบัน OpenClaw จะข้ามการประกาศสำรอง มิฉะนั้น announce, webhook และ none จะควบคุมเฉพาะสิ่งที่ตัวรันทำกับคำตอบสุดท้ายหลังจากเทิร์นของเอเจนต์
เมื่อเอเจนต์สร้างการเตือนแบบแยกจากแชตที่ใช้งานอยู่ OpenClaw จะจัดเก็บเป้าหมายการส่งมอบแบบสดที่รักษาไว้สำหรับเส้นทางประกาศสำรอง คีย์เซสชันภายในอาจเป็นตัวพิมพ์เล็ก; เป้าหมายการส่งมอบของผู้ให้บริการจะไม่ถูกสร้างขึ้นใหม่จากคีย์เหล่านั้นเมื่อมีบริบทแชตปัจจุบัน
การส่งมอบประกาศโดยนัยใช้รายการอนุญาตช่องทางที่กำหนดค่าไว้เพื่อตรวจสอบและเปลี่ยนเส้นทางเป้าหมายที่ล้าสมัย การอนุมัติจากที่จัดเก็บการจับคู่ DM ไม่ใช่ผู้รับระบบอัตโนมัติสำรอง; ตั้งค่า delivery.to หรือกำหนดค่ารายการ allowFrom ของช่องทางเมื่องานตามกำหนดเวลาควรส่งไปยัง DM เชิงรุก
ภาษาเอาต์พุต
งาน Cron ไม่อนุมานภาษาตอบกลับจากช่องทาง โลเคล หรือข้อความก่อนหน้า ให้ใส่กฎภาษาไว้ในข้อความตามกำหนดเวลาหรือเทมเพลต:
openclaw cron edit <jobId> \ --message "Summarize the updates. Respond in Chinese; keep URLs, code, and product names unchanged."สำหรับไฟล์เทมเพลต ให้คงคำสั่งเรื่องภาษาไว้ในพรอมป์ที่เรนเดอร์แล้ว และ
ตรวจสอบว่าตัวแทนที่ เช่น {{language}} ถูกเติมค่าก่อนที่งานจะเริ่มทำงาน หาก
ผลลัพธ์ผสมหลายภาษา ให้ระบุกฎให้ชัดเจน เช่น: "Use Chinese
for narrative text and keep technical terms in English."
การแจ้งเตือนความล้มเหลวใช้เส้นทางปลายทางแยกต่างหาก:
cron.failureDestinationตั้งค่าเริ่มต้นส่วนกลางสำหรับการแจ้งเตือนความล้มเหลวjob.delivery.failureDestinationแทนที่ค่านั้นเป็นรายงาน- หากไม่ได้ตั้งค่าทั้งสองรายการ และงานส่งผ่าน
announceอยู่แล้ว ตอนนี้การแจ้งเตือนความล้มเหลวจะย้อนกลับไปใช้เป้าหมาย announce หลักนั้น delivery.failureDestinationรองรับเฉพาะงานsessionTarget="isolated"เว้นแต่ว่าโหมดการส่งหลักคือwebhookfailureAlert.includeSkipped: trueเลือกให้นโยบายการแจ้งเตือน cron ของงานหรือส่วนกลางส่งการแจ้งเตือนรอบที่ถูกข้ามซ้ำ ๆ รอบที่ถูกข้ามจะเก็บตัวนับการข้ามต่อเนื่องแยกต่างหาก จึงไม่ส่งผลต่อการหน่วงถอยหลังเมื่อเกิดข้อผิดพลาดในการดำเนินการ
ตัวอย่าง CLI
ตัวเตือนแบบครั้งเดียว
openclaw cron add \ --name "Calendar check" \ --at "20m" \ --session main \ --system-event "Next heartbeat: check calendar." \ --wake nowงาน isolated แบบเกิดซ้ำ
openclaw cron create "0 7 * * *" \ "Summarize overnight updates." \ --name "Morning brief" \ --tz "America/Los_Angeles" \ --session isolated \ --announce \ --channel slack \ --to "channel:C1234567890"การแทนที่โมเดลและการคิด
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 \ --announceเอาต์พุต Webhook
openclaw cron create "0 18 * * 1-5" \ "Summarize today's deploys as JSON." \ --name "Deploy digest" \ --webhook "https://example.invalid/openclaw/cron"เอาต์พุตคำสั่ง
openclaw cron create "*/15 * * * *" \ --name "Queue depth probe" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"Webhooks
Gateway สามารถเปิดเผย HTTP webhook endpoints สำหรับทริกเกอร์ภายนอก เปิดใช้ในการกำหนดค่า:
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", },}การยืนยันตัวตน
ทุกคำขอต้องมีโทเค็น hook ผ่านส่วนหัว:
Authorization: Bearer <token>(แนะนำ)x-openclaw-token: <token>
โทเค็นในสตริงคิวรีจะถูกปฏิเสธ
POST /hooks/wake
จัดคิวเหตุการณ์ระบบสำหรับเซสชันหลัก:
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 แบบ isolated:
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:IHRpdGxlPSJob29rIOC4l-C4teC5iOC5geC4oeC4m-C5geC4peC5ieC4pyAoUE9TVCAvaG9va3MvPG5hbWU
)">
ชื่อ hook แบบกำหนดเองจะถูกแปลงผ่าน hooks.mappings ในการกำหนดค่า การแมปสามารถแปลง payload ใด ๆ ให้เป็นการกระทำ wake หรือ agent ด้วยเทมเพลตหรือการแปลงด้วยโค้ด
การผสานรวม Gmail PubSub
เชื่อมทริกเกอร์กล่องขาเข้า Gmail เข้ากับ OpenClaw ผ่าน Google PubSub
การตั้งค่าด้วยวิซาร์ด (แนะนำ)
openclaw webhooks gmail setup --account openclaw@gmail.comคำสั่งนี้เขียนการกำหนดค่า hooks.gmail เปิดใช้พรีเซ็ต Gmail และใช้ Tailscale Funnel สำหรับปลายทาง push
การเริ่ม Gateway โดยอัตโนมัติ
เมื่อ hooks.enabled=true และตั้งค่า hooks.gmail.account แล้ว Gateway จะเริ่ม gog gmail watch serve ตอนบูตและต่ออายุ watch โดยอัตโนมัติ ตั้งค่า OPENCLAW_SKIP_GMAIL_WATCHER=1 เพื่อเลือกไม่ใช้
การตั้งค่าด้วยตนเองครั้งเดียว
เลือกโปรเจกต์ GCP
เลือกโปรเจกต์ GCP ที่เป็นเจ้าของไคลเอ็นต์ OAuth ที่ gog ใช้:
gcloud auth logingcloud config set project <project-id>gcloud services enable gmail.googleapis.com pubsub.googleapis.comสร้างหัวข้อและให้สิทธิ์การเข้าถึง Gmail push
gcloud pubsub topics create gog-gmail-watchgcloud pubsub topics add-iam-policy-binding gog-gmail-watch \ --member=serviceAccount:gmail-api-push@system.gserviceaccount.com \ --role=roles/pubsub.publisherเริ่ม watch
gog gmail watch start \ --account openclaw@gmail.com \ --label INBOX \ --topic projects/<project-id>/topics/gog-gmail-watchการแทนที่โมเดล Gmail
{ hooks: { gmail: { model: "openrouter/meta-llama/llama-3.3-70b-instruct:free", thinking: "off", }, },}การจัดการงาน
# แสดงรายการงานทั้งหมดopenclaw cron list # รับงานที่จัดเก็บไว้หนึ่งรายการเป็น JSONopenclaw cron get <jobId> # แสดงงานหนึ่งรายการ รวมถึงเส้นทางการส่งที่ resolve แล้วopenclaw cron show <jobId> # แก้ไขงานopenclaw cron edit <jobId> --message "Updated prompt" --model "opus" # บังคับรันงานตอนนี้openclaw cron run <jobId> # บังคับรันงานตอนนี้และรอสถานะสิ้นสุดของงานopenclaw cron run <jobId> --wait --wait-timeout 10m --poll-interval 2s # รันเฉพาะเมื่อถึงกำหนดopenclaw cron run <jobId> --due # ดูประวัติการรันopenclaw cron runs --id <jobId> --limit 50 # ดูการรันที่เจาะจงหนึ่งรายการopenclaw cron runs --id <jobId> --run-id <runId> # ลบงานopenclaw cron remove <jobId> # การเลือกเอเจนต์ (การตั้งค่าแบบหลายเอเจนต์)openclaw cron create "0 6 * * *" "Check ops queue" --name "Ops sweep" --session isolated --agent opsopenclaw cron edit <jobId> --clear-agentopenclaw cron run <jobId> จะคืนค่าหลังจากนำการรันด้วยตนเองเข้า enqueue แล้ว ใช้ --wait สำหรับ shutdown hooks, สคริปต์บำรุงรักษา หรือระบบอัตโนมัติอื่นที่ต้องบล็อกจนกว่าการรันในคิวจะเสร็จสิ้น โหมดรอจะโพล runId ที่คืนมาอย่างเจาะจง โดยจะออกด้วย 0 สำหรับสถานะ ok และไม่ใช่ศูนย์สำหรับ error, skipped หรือการรอหมดเวลา
เครื่องมือ cron ของเอเจนต์จะคืนค่าสรุปงานแบบกะทัดรัด (id, name, enabled, nextRunAtMs, scheduleKind, lastRunStatus) จาก cron(action: "list"); ใช้ cron(action: "get", jobId: "...") สำหรับนิยามงานเต็มหนึ่งรายการ ผู้เรียก Gateway โดยตรงสามารถส่ง compact: true ไปยัง cron.list ได้; หากไม่ระบุ จะคงการตอบกลับเต็มรูปแบบเดิมพร้อมตัวอย่างการส่ง
openclaw cron create เป็น alias ของ openclaw cron add และงานใหม่สามารถใช้กำหนดการแบบ positional ("0 9 * * 1", "every 1h", "20m" หรือ timestamp แบบ ISO) ตามด้วยพรอมป์เอเจนต์แบบ positional ใช้ --webhook <url> บน cron add|create หรือ cron edit เพื่อ POST เพย์โหลดการรันที่เสร็จสิ้นไปยังปลายทาง HTTP การส่ง Webhook ไม่สามารถใช้ร่วมกับแฟล็กการส่งแชต เช่น --announce, --channel, --to, --thread-id หรือ --account ได้ บน cron edit, --clear-channel, --clear-to, --clear-thread-id และ --clear-account จะยกเลิกการตั้งค่าฟิลด์ routing เหล่านั้นทีละรายการ (แต่ละรายการจะถูกปฏิเสธหากใช้ร่วมกับแฟล็กตั้งค่าที่ตรงกัน) ซึ่งแตกต่างจาก --no-deliver ที่ปิดการส่ง fallback ของ runner
การกำหนดค่า
{ cron: { enabled: true, store: "~/.openclaw/cron/jobs.json", maxConcurrentRuns: 8, 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 จำกัดทั้งการ dispatch cron ตามกำหนดเวลาและการดำเนินการ agent-turn แบบแยก และมีค่าเริ่มต้นเป็น 8 การ turn ของเอเจนต์ cron แบบแยกใช้เลนการดำเนินการเฉพาะ cron-nested ของคิวภายใน ดังนั้นการเพิ่มค่านี้ทำให้การรัน LLM cron อิสระคืบหน้าแบบขนานได้ แทนที่จะเริ่มเฉพาะ wrapper cron ชั้นนอกทีละตัว การตั้งค่านี้จะไม่ขยายเลน nested ที่ใช้ร่วมกันและไม่ใช่ cron
cron.store เป็นคีย์ store เชิงตรรกะและพาธนำเข้าของ doctor แบบเดิม รัน openclaw doctor --fix เพื่อนำเข้า store JSON ที่มีอยู่ไปยัง SQLite และเก็บถาวร การเปลี่ยนแปลง cron ในอนาคตควรทำผ่าน CLI หรือ Gateway API
ปิดใช้ cron: cron.enabled: false หรือ OPENCLAW_SKIP_CRON=1
พฤติกรรมการลองใหม่
การลองใหม่แบบครั้งเดียว: ข้อผิดพลาดชั่วคราว (rate limit, overload, network, server error) จะลองใหม่สูงสุด 3 ครั้งด้วย exponential backoff ข้อผิดพลาดถาวรจะปิดใช้ทันที
การลองใหม่แบบเกิดซ้ำ: exponential backoff (30s ถึง 60m) ระหว่างการลองใหม่ Backoff จะรีเซ็ตหลังจากการรันครั้งถัดไปสำเร็จ
การบำรุงรักษา
cron.sessionRetention (ค่าเริ่มต้น 24h) จะล้างรายการเซสชันการรันแบบแยก cron.runLog.keepLines จำกัดจำนวนแถวประวัติการรัน SQLite ที่เก็บไว้ต่อหนึ่งงาน; maxBytes ถูกเก็บไว้เพื่อความเข้ากันได้ของการกำหนดค่ากับ run log แบบไฟล์รุ่นเก่า
การแก้ไขปัญหา
ลำดับคำสั่ง
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ให้ตรวจสอบ timezone (--tz) เทียบกับ timezone ของโฮสต์ reason: not-dueในผลลัพธ์การรันหมายความว่าการรันด้วยตนเองถูกตรวจสอบด้วยopenclaw cron run <jobId> --dueและงานยังไม่ถึงกำหนด
Cron ทำงานแล้วแต่ไม่มีการส่ง
- โหมดการส่ง
noneหมายความว่าไม่คาดว่าจะมีการส่ง fallback ของ runner เอเจนต์ยังสามารถส่งโดยตรงด้วยเครื่องมือmessageเมื่อมีเส้นทางแชตพร้อมใช้งาน - เป้าหมายการส่งหายไป/ไม่ถูกต้อง (
channel/to) หมายความว่าขาออกถูกข้าม - สำหรับ Matrix งานที่คัดลอกมาหรือเป็นแบบเดิมที่มี ID ห้อง
delivery.toเป็นตัวพิมพ์เล็กอาจล้มเหลวได้ เพราะ ID ห้องของ Matrix แยกแยะตัวพิมพ์ใหญ่เล็ก แก้ไขงานเป็นค่า!room:serverหรือroom:!room:serverที่ตรงจาก Matrix - ข้อผิดพลาดการยืนยันตัวตนของช่องทาง (
unauthorized,Forbidden) หมายความว่าการส่งถูกบล็อกด้วยข้อมูลประจำตัว - หากการรันแบบแยกคืนเฉพาะโทเค็นเงียบ (
NO_REPLY/no_reply) OpenClaw จะระงับการส่งขาออกโดยตรงและระงับเส้นทางสรุปที่เข้าคิวเป็น fallback ด้วย ดังนั้นจะไม่มีอะไรถูกโพสต์กลับไปยังแชต - หากเอเจนต์ควรส่งข้อความถึงผู้ใช้เอง ให้ตรวจสอบว่างานมีเส้นทางที่ใช้ได้ (
channel: "last"พร้อมแชตก่อนหน้า หรือช่องทาง/เป้าหมายที่ระบุชัดเจน)
Cron หรือ Heartbeat ดูเหมือนจะป้องกันการ rollover แบบ /new
- ความสดใหม่ของการรีเซ็ตรายวันและเมื่อ idle ไม่ได้อิงกับ
updatedAt; ดู การจัดการเซสชัน - การปลุกของ cron, การรัน Heartbeat, การแจ้งเตือน exec และการบันทึกบัญชีของ Gateway อาจอัปเดตแถวเซสชันสำหรับ routing/status แต่ไม่ได้ขยาย
sessionStartedAtหรือlastInteractionAt - สำหรับแถว legacy ที่สร้างก่อนฟิลด์เหล่านั้นมีอยู่ OpenClaw สามารถกู้คืน
sessionStartedAtจากส่วนหัวเซสชัน transcript JSONL เมื่อไฟล์ยังพร้อมใช้งาน แถว idle legacy ที่ไม่มีlastInteractionAtจะใช้เวลาเริ่มต้นที่กู้คืนได้นั้นเป็น baseline ของ idle
ข้อควรระวังเกี่ยวกับ Timezone
- Cron ที่ไม่มี
--tzจะใช้ timezone ของโฮสต์ Gateway - กำหนดการ
atที่ไม่มี timezone จะถือว่าเป็น UTC activeHoursของ Heartbeat ใช้การ resolve timezone ที่กำหนดค่าไว้
ที่เกี่ยวข้อง
- ระบบอัตโนมัติ — กลไกอัตโนมัติทั้งหมดโดยสรุป
- งานเบื้องหลัง — บัญชีงานสำหรับการดำเนินการ cron
- Heartbeat — การ turn ของเซสชันหลักเป็นระยะ
- Timezone — การกำหนดค่า timezone