Automation
งานที่กำหนดเวลาไว้
Cron คือตัวกำหนดเวลาในตัวของ Gateway โดยจะจัดเก็บงานแบบถาวร ปลุกเอเจนต์ในเวลาที่เหมาะสม และสามารถส่งผลลัพธ์ไปยังช่องแชต Webhook หรือไม่ส่งไปที่ใดเลย
เริ่มต้นอย่างรวดเร็ว
เพิ่มการเตือนแบบครั้งเดียว
openclaw cron create "2027-02-01T16:00:00Z" \ --name "การเตือน" \ --session main \ --system-event "การเตือน: ตรวจสอบฉบับร่างเอกสาร cron" \ --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 ไม่ใช่ภายในโมเดล Gateway ต้องทำงานอยู่เพื่อให้กำหนดการเริ่มทำงานได้
- ข้อกำหนดงาน สถานะรันไทม์ และประวัติการรันจะถูกจัดเก็บอย่างถาวรในฐานข้อมูลสถานะ SQLite ที่ใช้ร่วมกันของ OpenClaw ดังนั้นการเริ่มระบบใหม่จะไม่ทำให้กำหนดการสูญหาย
- การเรียกใช้ cron แต่ละครั้งจะสร้างระเบียน งานเบื้องหลัง
- งานแบบครั้งเดียว (
--at) จะถูกลบโดยอัตโนมัติหลังจากสำเร็จตามค่าเริ่มต้น ให้ส่ง--keep-after-runเพื่อเก็บงานไว้ - งบประมาณเวลาตามนาฬิกาสำหรับแต่ละรอบ:
--timeout-secondsเมื่อตั้งค่าไว้ มิฉะนั้น งานรอบเอเจนต์แบบแยก/แยกออกจากเซสชันจะถูกจำกัดด้วยตัวเฝ้าระวัง 60 นาทีของ cron ก่อนที่การหมดเวลาของรอบเอเจนต์พื้นฐาน (agents.defaults.timeoutSecondsค่าเริ่มต้น 48 ชั่วโมง) จะมีผล งานคำสั่งมีค่าเริ่มต้น 10 นาที และเพย์โหลดสคริปต์มีค่าเริ่มต้น 5 นาที - เมื่อ Gateway เริ่มทำงาน งานรอบเอเจนต์แบบแยกที่เลยกำหนดจะถูกกำหนดเวลาใหม่แทนการเล่นซ้ำทันที เพื่อไม่ให้งานเริ่มต้นโมเดล/เครื่องมือรบกวนช่วงเชื่อมต่อช่องทาง
- หากคุณเรียกใช้
openclaw agentจาก cron ของระบบหรือตัวกำหนดเวลาภายนอกอื่น ให้ครอบด้วยการยกระดับเป็นการบังคับยุติ แม้ว่า CLI จะจัดการSIGTERM/SIGINTอยู่แล้วก็ตาม การรันที่รองรับโดย Gateway จะขอให้ Gateway ยกเลิกการรันที่ยอมรับแล้ว ส่วนการรันสำรองแบบภายในเครื่องและแบบฝังตัวจะได้รับสัญญาณยกเลิกเดียวกัน สำหรับ GNUtimeoutให้เลือกใช้timeout -k 60 600 openclaw agent ...แทนtimeout 600 ...แบบธรรมดา — ค่า-kเป็นมาตรการสำรองหากกระบวนการไม่สามารถปิดงานที่ค้างอยู่ได้ทันเวลา สำหรับยูนิต systemd ให้ใช้สัญญาณหยุดSIGTERMพร้อมช่วงผ่อนผัน (TimeoutStopSec) ก่อนการบังคับยุติขั้นสุดท้าย การใช้--run-idซ้ำขณะที่การรัน Gateway เดิมยังทำงานอยู่ จะแจ้งว่ารายการซ้ำกำลังดำเนินการอยู่แทนการเริ่มรันครั้งที่สอง
การเพิ่มความแข็งแกร่งให้การรันแบบแยก
- เมื่อการรันแบบแยกเสร็จสิ้น ระบบจะพยายามปิดแท็บ/กระบวนการเบราว์เซอร์ที่ติดตามสำหรับเซสชัน
cron:<jobId>และกำจัดอินสแตนซ์รันไทม์ MCP ที่รวมมาและสร้างขึ้นสำหรับงาน ผ่านเส้นทางการรื้อถอนร่วมเดียวกับที่ใช้โดยการรันเซสชันหลักและเซสชันแบบกำหนดเอง ระบบจะละเว้นความล้มเหลวในการล้างข้อมูล เพื่อให้ผลลัพธ์ของ cron ยังคงมีผลเหนือกว่า - การรันแบบแยกที่ได้รับสิทธิ์จำกัดสำหรับการล้างข้อมูล cron ของตนเอง สามารถอ่านสถานะตัวกำหนดเวลา รายการที่กรองให้มีเฉพาะงานของตนเอง และประวัติการรันของงานนั้น รวมถึงสามารถลบได้เฉพาะงานของตนเองเท่านั้น
- การรันแบบแยกจะป้องกันการตอบรับที่ล้าสมัย: หากผลลัพธ์แรกเป็นเพียงการอัปเดตสถานะชั่วคราว (
on it,pulling everything togetherและคำบอกใบ้ที่คล้ายกัน) และไม่มีเอเจนต์ย่อยรุ่นถัดไปที่ยังรับผิดชอบคำตอบสุดท้าย OpenClaw จะส่งพรอมต์ซ้ำหนึ่งครั้งเพื่อขอผลลัพธ์จริงก่อนส่งมอบ - ระบบจะจดจำข้อมูลเมตาการปฏิเสธการดำเนินการแบบมีโครงสร้าง (รวมถึงตัวครอบ
UNAVAILABLEของโฮสต์ Node ซึ่งข้อผิดพลาดที่ซ้อนอยู่เริ่มต้นด้วยSYSTEM_RUN_DENIEDหรือINVALID_REQUEST) เพื่อไม่ให้รายงานคำสั่งที่ถูกบล็อกว่าเป็นการรันที่สำเร็จ ขณะเดียวกันจะไม่เข้าใจข้อความปกติของผู้ช่วยผิดว่าเป็นการปฏิเสธ - ความล้มเหลวของเอเจนต์ระดับการรันจะนับเป็นข้อผิดพลาดของงาน แม้ไม่มีเพย์โหลดตอบกลับ ดังนั้นความล้มเหลวของโมเดล/ผู้ให้บริการจะเพิ่มตัวนับข้อผิดพลาดและเรียกใช้การแจ้งเตือนความล้มเหลว แทนการปิดงานว่าสำเร็จ
- เมื่องานถึง
timeoutSecondscron จะยกเลิกการรันและให้ช่วงเวลาสั้น ๆ สำหรับล้างข้อมูล หากการรันไม่สามารถปิดงานที่ค้างอยู่ได้ การล้างข้อมูลที่ Gateway เป็นเจ้าของจะบังคับล้างความเป็นเจ้าของเซสชันของการรันนั้น ก่อนที่ cron จะบันทึกการหมดเวลา เพื่อไม่ให้งานแชตในคิวติดค้างอยู่หลังเซสชันประมวลผลที่ล้าสมัย - การหยุดค้างระหว่างการตั้งค่า/เริ่มทำงานจะได้รับการหมดเวลาเฉพาะระยะ (เช่น
cron: isolated agent setup timed out before runner startหรือcron: isolated agent run stalled before execution start (last phase: context-engine)) ตัวเฝ้าระวังเหล่านี้ครอบคลุมผู้ให้บริการแบบฝังตัวและแบบรองรับโดย CLI แม้ก่อนกระบวนการ CLI ภายนอกจะเริ่มทำงาน และถูกจำกัดแยกจากค่าtimeoutSecondsที่ยาวนาน เพื่อให้ความล้มเหลวจากการเริ่มระบบเย็น/การยืนยันตัวตน/บริบทปรากฏขึ้นอย่างรวดเร็ว
การกระทบยอดงาน
การกระทบยอดงาน cron จะอิงรันไทม์เป็นลำดับแรก และอิงประวัติถาวรเป็นลำดับที่สอง: งาน cron ที่ทำงานอยู่จะยังคงอยู่ตราบใดที่รันไทม์ cron ยังคงติดตามว่างานนั้นกำลังทำงาน แม้ว่ายังมีแถวเซสชันลูกเก่าคงอยู่ก็ตาม เมื่อรันไทม์เลิกเป็นเจ้าของงานและพ้นช่วงผ่อนผัน 5 นาทีแล้ว การตรวจสอบบำรุงรักษาจะตรวจบันทึกการรันและสถานะงานที่จัดเก็บไว้อย่างถาวรสำหรับการรัน cron:<jobId>:<startedAt> ที่ตรงกัน ผลลัพธ์สิ้นสุดในตำแหน่งนั้นจะปิดบัญชีงานให้สมบูรณ์ มิฉะนั้น การบำรุงรักษาที่ Gateway เป็นเจ้าของสามารถทำเครื่องหมายงานเป็น lost ได้ การตรวจสอบ CLI แบบออฟไลน์สามารถกู้คืนจากประวัติถาวรได้ แต่ชุดงานที่ทำงานอยู่ภายในกระบวนการของตัวเองซึ่งว่างเปล่า ไม่ใช่หลักฐานว่าการรันที่ Gateway เป็นเจ้าของหายไปแล้ว
ประเภทกำหนดการ
| ชนิด | แฟล็ก CLI | คำอธิบาย |
|---|---|---|
at |
--at |
การประทับเวลาแบบครั้งเดียว (ISO 8601 หรือแบบสัมพัทธ์ เช่น 20m) |
every |
--every |
ช่วงเวลาคงที่ (10m, 1h, 1d) |
cron |
--cron |
นิพจน์ cron แบบ 5 ฟิลด์หรือ 6 ฟิลด์ พร้อม --tz ซึ่งเป็นตัวเลือก |
on-exit |
--on-exit |
เริ่มทำงานหนึ่งครั้งเมื่อคำสั่งที่เฝ้าดูจบการทำงาน (ทริกเกอร์เหตุการณ์; ยังคงอยู่หลังการรื้อถอนรอบ; --on-exit-cwd เป็นตัวเลือก) |
การประทับเวลาที่ไม่มีเขตเวลาจะถือว่าเป็น UTC เพิ่ม --tz America/New_York เพื่อตีความวันเวลาของ --at ที่ไม่มีออฟเซ็ต หรือเพื่อประเมินนิพจน์ cron ในเขตเวลา IANA นั้น นิพจน์ cron ที่ไม่มี --tz จะใช้เขตเวลาของโฮสต์ Gateway ไม่สามารถใช้ --tz ร่วมกับ --every หรือ --on-exit ได้
นิพจน์แบบเกิดซ้ำเมื่อต้นชั่วโมง (นาที 0 โดยฟิลด์ชั่วโมงเป็นไวลด์การ์ด) จะถูกกระจายเวลาโดยอัตโนมัติสูงสุด 5 นาที เพื่อลดการพุ่งสูงของโหลด ใช้ --exact เพื่อบังคับเวลาที่แม่นยำ หรือ --stagger 30s เพื่อกำหนดช่วงเวลาอย่างชัดเจน (เฉพาะกำหนดการ cron)
จังหวะแบบไดนามิก (การกำหนดระยะ)
งานที่เกิดซ้ำสามารถตั้งค่า pacing.min และ/หรือ pacing.max เป็นสตริงระยะเวลา เช่น 15m หรือ 4h โดยต้องกำหนดขอบเขตอย่างน้อยหนึ่งค่า ใช้ --pacing-min และ --pacing-max ร่วมกับ cron add|edit (--clear-pacing จะลบขอบเขตทั้งสอง)
ระหว่างการรันแบบแยก งานที่กำหนดระยะสามารถเรียกเครื่องมือ cron ด้วย action: "next_check" และ in: "30m" ข้อเสนอจะมีผลเฉพาะกับงานที่กำลังทำงานอยู่ในขณะนั้น และวัดจากเวลาที่การรันเสร็จสมบูรณ์ OpenClaw จะจำกัดค่าให้อยู่ภายในขอบเขตที่กำหนดไว้อย่างเงียบ ๆ
การกำหนดระยะโดยไม่มีข้อเสนอจะไม่เปลี่ยนกำหนดการปกติ การรันที่ล้มเหลว หมดเวลา และถูกข้ามจะละทิ้งข้อเสนอ ดังนั้นพฤติกรรมการลองใหม่และการถอยระยะเมื่อเกิดข้อผิดพลาดที่มีอยู่จะมีผลเหนือกว่า การบังคับรันงานที่เกิดซ้ำด้วยตนเองเป็นการทำงานนอกลำดับ และจะคงช่วงเวลาปกติหรือช่วงเวลาที่กำหนดระยะซึ่งรอดำเนินการไว้ สำหรับงานที่ทริกเกอร์ตามเงื่อนไข ช่วงเวลาขั้นต่ำในตัวยังคงเป็นขอบเขตล่าง แม้ว่าข้อเสนอจะขอให้ตรวจสอบเร็วกว่านั้น
วันของเดือนและวันของสัปดาห์ใช้ตรรกะ OR
นิพจน์ Cron จะถูกแยกวิเคราะห์โดย croner เมื่อทั้งฟิลด์วันของเดือนและวันของสัปดาห์ไม่ใช่ไวลด์การ์ด croner จะถือว่าตรงกันเมื่อฟิลด์ ใดฟิลด์หนึ่ง ตรงกัน ไม่ใช่ทั้งสองฟิลด์ นี่คือพฤติกรรมมาตรฐานของ Vixie cron
# เจตนา: "9 นาฬิกาของวันที่ 15 เฉพาะเมื่อเป็นวันจันทร์"# ผลจริง: "9 นาฬิกาของทุกวันที่ 15 และ 9 นาฬิกาของทุกวันจันทร์"0 9 15 * 1กำหนดการนี้จะเริ่มทำงานประมาณ 5-6 ครั้งต่อเดือน แทนที่จะเป็น 0-1 ครั้งต่อเดือน หากต้องการให้ตรงตามเงื่อนไขทั้งสอง ให้ใช้ตัวแก้ไขวันของสัปดาห์ + ของ croner (0 9 15 * +1) หรือกำหนดเวลาตามฟิลด์หนึ่งและตรวจสอบอีกฟิลด์ในพรอมต์หรือคำสั่งของงาน
ทริกเกอร์เหตุการณ์ (ตัวเฝ้าดูเงื่อนไข)
ทริกเกอร์เหตุการณ์จะเพิ่มสคริปต์เงื่อนไขแบบไม่มีส่วนติดต่อให้กับกำหนดการ every หรือ cron Cron จะประเมินสคริปต์เมื่อถึงกำหนดของงาน และรันเพย์โหลดปกติเฉพาะเมื่อสคริปต์คืนค่า fire: true:
{ schedule: { kind: "every", everyMs: 30000 }, trigger: { // เริ่มทำงานเฉพาะเมื่อสถานะที่สังเกตได้แตกต่างจากการประเมินครั้งล่าสุด script: "const res = await tools.call('exec', { command: 'gh pr checks 123 --json state -q \\'.[].state\\' | sort -u' }); const status = String(res?.result?.details?.aggregated ?? '').trim(); json({ fire: status !== trigger.state?.status, message: `CI ของ PR 123: ${trigger.state?.status ?? 'ไม่ทราบ'} -> ${status}`, state: { status } });", once: false, }, payload: { kind: "agentTurn", message: "ตรวจสอบการเปลี่ยนแปลงสถานะ CI" },}สคริปต์ต้องคืนค่า { fire, message?, state? } สถานะ JSON ก่อนหน้าจะพร้อมใช้งานในรูปแบบ trigger.state ที่ถูกตรึงอย่างลึก ให้คืนค่า state ใหม่เพื่อจัดเก็บอย่างถาวร สถานะถูกจำกัดไว้ที่ 16 KB เมื่อผลลัพธ์ที่เริ่มทำงานมี message cron จะผนวกค่านั้นต่อท้ายข้อความเหตุการณ์ระบบหรือข้อความรอบเอเจนต์ก่อนดำเนินการ once: true จะปิดใช้งานงานหลังจากเพย์โหลดที่เริ่มทำงานครั้งแรกสำเร็จ
fire: false จะจัดเก็บสถานะการประเมินและตัวนับอย่างถาวร จากนั้นกำหนดเวลาใหม่โดยไม่สร้างประวัติการรัน หากการรันเพย์โหลดที่เริ่มทำงานล้มเหลว state ที่คืนมาจะ ไม่ ถูกจัดเก็บ — การประเมินครั้งถัดไปจะเห็นสถานะก่อนหน้าและสามารถเริ่มทำงานอีกครั้ง ดังนั้นควรเขียนสคริปต์เป็นการตรวจสอบแบบอ่านอย่างเดียว และเก็บการดำเนินการไว้ในเพย์โหลด กำหนดการทริกเกอร์มีช่วงเวลาขั้นต่ำที่กำหนดค่าได้ (ค่าเริ่มต้น 30 วินาที) การประเมินแต่ละครั้งมีงบประมาณเวลาตามนาฬิกา 30 วินาที และเรียกเครื่องมือได้สูงสุด 5 ครั้ง
ออกแบบตัวเฝ้าดูโดยอิง สถานะที่ดำเนินการได้ ไม่ใช่เฉพาะความสำเร็จ: ตัวเฝ้าดูที่เงียบลงเมื่อการตรวจสอบล้มเหลวหรือหมดเวลา จะดูเหมือนทำงานปกติทั้งที่เสียอยู่ เปรียบเทียบผลการสังเกตกับ trigger.state และคืนสถานะใหม่เพื่อขจัดรายการซ้ำ อย่าพึ่งพาหน่วยความจำของโมเดลหรือกระบวนการ เมื่อเริ่มทำงาน ให้ทำให้ message มีข้อมูลครบถ้วนในตัวเอง เพราะค่านั้นจะกลายเป็นบริบทเหตุการณ์ทั้งหมดของการรันที่เริ่มทำงาน
สร้างตัวเฝ้าดูจากไฟล์สคริปต์ในเครื่อง (- จะอ่านสคริปต์จาก stdin):
openclaw cron add \ --name "ตัวเฝ้าดู CI ของ PR" \ --every 30s \ --trigger-script ./watch-pr-ci.js \ --message "ตอบสนองต่อการเปลี่ยนแปลงสถานะ CI" \ --session isolatedเพย์โหลด
ทุกงานมีเพย์โหลดเพียงหนึ่งชนิด ซึ่งเลือกด้วยแฟล็ก:
| เพย์โหลด | แฟล็ก | การทำงาน |
|---|---|---|
| เหตุการณ์ระบบ | --system-event <text> |
เข้าคิวในเซสชันหลัก โดยไม่เรียกโมเดลด้วยตัวเอง |
| ข้อความเอเจนต์ | --message <text> |
รอบการทำงานของเอเจนต์ที่ใช้โมเดล |
| คำสั่ง | --command <shell> หรือ --command-argv <json> |
เชลล์/โพรเซสบนโฮสต์ Gateway โดยไม่เรียกโมเดล |
| สคริปต์ | --script <file|-> |
สคริปต์โหมดโค้ดแบบไม่มีส่วนติดต่อผู้ใช้ที่ใช้เครื่องมือของเอเจนต์เจ้าของ |
ตัวเลือกรอบการทำงานของเอเจนต์
--messagestringrequiredข้อความพรอมป์ (จำเป็นสำหรับงานเซสชันแบบแยก/ปัจจุบัน/กำหนดเอง)
--modelstringแทนที่โมเดล โดยต้องแปลงค่าได้เป็นโมเดลที่อนุญาต มิฉะนั้นการทำงานจะล้มเหลวพร้อมข้อผิดพลาดในการตรวจสอบความถูกต้อง
--fallbacksstringรายการโมเดลสำรองรายงาน เช่น --fallbacks openai/gpt-5.6-sol,openrouter/meta-llama/llama-3.3-70b-instruct:free ส่ง --fallbacks "" สำหรับการทำงานแบบเข้มงวดที่ไม่มีโมเดลสำรอง
--clear-fallbacksbooleanเมื่อใช้กับ cron edit จะนำการแทนที่โมเดลสำรองรายงานออก เพื่อให้งานเป็นไปตามลำดับความสำคัญของโมเดลสำรองที่กำหนดค่าไว้ ใช้ร่วมกับ --fallbacks ไม่ได้
--clear-modelbooleanเมื่อใช้กับ cron edit จะนำการแทนที่โมเดลรายงานออก เพื่อให้งานเป็นไปตามลำดับความสำคัญปกติของโมเดล Cron (การแทนที่เซสชัน Cron ที่จัดเก็บไว้ หรือโมเดลของเอเจนต์/ค่าเริ่มต้น) ใช้ร่วมกับ --model ไม่ได้
--thinkingstringแทนที่ระดับการคิด (off|minimal|low|medium|high|xhigh|adaptive|max|ultra) ระดับที่ใช้ได้ยังคงขึ้นอยู่กับโมเดลและรันไทม์เอเจนต์ที่เลือก
--clear-thinkingbooleanเมื่อใช้กับ cron edit จะนำการแทนที่การคิดรายงานออก ใช้ร่วมกับ --thinking ไม่ได้
--light-contextbooleanข้ามการแทรกไฟล์เริ่มต้นของเวิร์กสเปซ
--toolsstringจำกัดเครื่องมือที่งานสามารถใช้ได้ เช่น --tools exec,read
--model กำหนดโมเดลหลักของงาน โดยไม่แทนที่การตั้งค่า /model ของเซสชัน ดังนั้นเชนโมเดลสำรองที่กำหนดค่าไว้ยังคงมีผลเพิ่มเติม หากแปลงค่าโมเดลไม่ได้หรือโมเดลไม่ได้รับอนุญาต การทำงานจะล้มเหลวพร้อมข้อผิดพลาดในการตรวจสอบความถูกต้องที่ชัดเจน แทนที่จะถอยกลับไปใช้ค่าเริ่มต้นโดยไม่มีการแจ้งเตือน หากงานมี --model แต่ไม่มีรายการโมเดลสำรองแบบชัดเจนหรือที่กำหนดค่าไว้ OpenClaw จะส่งการแทนที่โมเดลสำรองแบบว่าง แทนที่จะแอบเพิ่มโมเดลหลักของเอเจนต์เป็นเป้าหมายลองใหม่
ลำดับความสำคัญในการเลือกโมเดลสำหรับงานแบบแยก จากสูงสุดก่อน:
- เพย์โหลดรายงาน
model(การกำหนดค่าแบบชัดเจน หากโมเดลไม่ได้รับอนุญาต การทำงานจะล้มเหลว) - การแทนที่โมเดลจากฮุก Gmail (เฉพาะเมื่อการทำงานมาจาก Gmail และการแทนที่นั้นได้รับอนุญาต)
- การแทนที่โมเดลของเซสชัน Cron ที่จัดเก็บไว้และผู้ใช้เลือก
- การเลือกโมเดลของเอเจนต์/ค่าเริ่มต้น
โหมดเร็วเป็นไปตามการเลือกแบบสดที่แปลงค่าแล้ว หากการกำหนดค่าโมเดลที่เลือกมี params.fastMode งาน Cron แบบแยกจะใช้ค่านั้นเป็นค่าเริ่มต้น แต่การแทนที่ fastMode ที่จัดเก็บไว้ในเซสชัน (จากนั้นคือ fastModeDefault ของเอเจนต์) ยังคงมีลำดับความสำคัญเหนือการกำหนดค่าโมเดลได้ทั้งสองทิศทาง โหมดอัตโนมัติใช้เกณฑ์ตัด params.fastAutoOnSeconds ของโมเดล โดยมีค่าเริ่มต้นเป็น 60 วินาที
หากการทำงานพบการส่งต่อจากการสลับโมเดลแบบสด Cron จะลองใหม่ด้วยผู้ให้บริการ/โมเดลที่สลับแล้ว และบันทึกการเลือกนั้น (รวมถึงโปรไฟล์การยืนยันตัวตนใหม่ หากมี) สำหรับการทำงานที่กำลังดำเนินอยู่ จำนวนการลองใหม่มีขีดจำกัด โดยหลังจากความพยายามครั้งแรกและการลองใหม่จากการสลับ 2 ครั้ง Cron จะยกเลิกแทนที่จะวนซ้ำ
ก่อนเริ่มการทำงานแบบแยก OpenClaw จะตรวจสอบเอนด์พอยต์ภายในที่เข้าถึงได้สำหรับผู้ให้บริการ api: "ollama" และ api: "openai-completions" ที่กำหนดค่าไว้ ซึ่ง baseUrl เป็นลูปแบ็ก เครือข่ายส่วนตัว หรือ .local การตรวจสอบล่วงหน้านี้จะไล่ตามเชนโมเดลสำรองที่กำหนดค่าไว้ของงาน และจะทำเครื่องหมายการทำงานเป็น skipped ก็ต่อเมื่อผู้สมัครทั้งหมดเข้าถึงไม่ได้ ส่วน --fallbacks "" จะจำกัดการไล่ตรวจสอบอย่างเข้มงวดให้เหลือเฉพาะโมเดลหลัก เอนด์พอยต์ที่ใช้งานไม่ได้จะบันทึกการทำงานเป็น skipped พร้อมข้อผิดพลาดที่ชัดเจน แทนที่จะเริ่มเรียกโมเดล ผลลัพธ์จะถูกแคชเป็นเวลา 5 นาทีต่อเอนด์พอยต์ (ไม่ใช่ต่องานหรือโมเดล) ดังนั้นงานจำนวนมากที่ถึงกำหนดและใช้เซิร์ฟเวอร์ Ollama/vLLM/SGLang/LM Studio ภายในที่หยุดทำงานร่วมกัน จะมีค่าใช้จ่ายเพียงการตรวจสอบหนึ่งครั้งแทนที่จะเกิดคำขอจำนวนมากพร้อมกัน การทำงานที่ข้ามเนื่องจากการตรวจสอบล่วงหน้าจะไม่เพิ่มการหน่วงเวลาหลังข้อผิดพลาดในการดำเนินการ ตั้งค่า failureAlert.includeSkipped เพื่อเลือกรับการแจ้งเตือนการข้ามซ้ำ
เพย์โหลดคำสั่ง
เพย์โหลดคำสั่งเรียกใช้สคริปต์แบบกำหนดผลลัพธ์ได้ภายในตัวจัดกำหนดการของ Gateway โดยไม่เริ่มรอบการทำงานที่ใช้โมเดล สคริปต์ทำงานบนโฮสต์ 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 แบบตรงตัวโดยไม่มีการแยกวิเคราะห์ของเชลล์ ตัวเลือกเสริม --command-env KEY=VALUE (ระบุซ้ำได้), --command-input, --timeout-seconds (ค่าเริ่มต้น 10 นาที), --no-output-timeout-seconds และ --output-max-bytes ใช้ควบคุมสภาพแวดล้อมของโพรเซส stdin และขอบเขตเอาต์พุต
ข้อความที่นำส่งจะได้มาจากเอาต์พุตของโพรเซส โดย stdout ที่ไม่ว่างจะมีลำดับความสำคัญ หาก stdout ว่างและ stderr ไม่ว่าง ระบบจะนำส่ง stderr หากมีทั้งสองอย่าง Cron จะส่งบล็อก stdout: / stderr: ขนาดเล็ก รหัสออก 0 จะบันทึกการทำงานเป็น ok ส่วนรหัสออกที่ไม่ใช่ศูนย์ สัญญาณ หมดเวลา หรือหมดเวลาเนื่องจากไม่มีเอาต์พุต จะบันทึกเป็น error และอาจทริกเกอร์การแจ้งเตือนความล้มเหลว คำสั่งที่พิมพ์เพียง NO_REPLY จะใช้การระงับโทเค็นเงียบตามปกติของ Cron และไม่โพสต์สิ่งใดกลับไปยังแชต
เพย์โหลดสคริปต์
เพย์โหลดสคริปต์ทำงานแบบไม่มีส่วนติดต่อผู้ใช้ในตัวดำเนินการโหมดโค้ดเดียวกับสคริปต์ทริกเกอร์ โดยไม่เริ่มรอบการสนทนาของเอเจนต์ เปิดใช้ cron.triggers.enabled ก่อนสร้างหรือเรียกใช้ โดยเกตระบบอัตโนมัติที่เป็นอันตรายนี้ครอบคลุมทั้งสคริปต์ทริกเกอร์และเพย์โหลดสคริปต์ งานสคริปต์รองรับเฉพาะเป้าหมายเซสชัน main และ isolated
openclaw cron create "0 * * * *" \ --name "Hourly queue check" \ --script ./automation/check-queue.js \ --script-timeout-seconds 300 \ --script-tool-budget 50 \ --session isolated \ --announceใช้ --script <file|-> เพื่ออ่าน JavaScript จากไฟล์หรือ stdin ค่าหมดเวลามีค่าเริ่มต้นเป็น 300 วินาทีและจำกัดสูงสุดที่ 900 ส่วนงบประมาณเครื่องมือมีค่าเริ่มต้นเป็น 50 การเรียกและจำกัดสูงสุดที่ 200 งบประมาณเพย์โหลดเหล่านี้แยกจากงบประมาณการประเมินเกตทริกเกอร์ที่มีขนาดเล็กกว่า
สคริปต์อาจส่งคืนอ็อบเจ็กต์ที่มีฟิลด์เสริมต่อไปนี้:
notify: ข้อความที่นำส่งผ่านโหมดการนำส่งannounce,webhookหรือnoneของงาน หากละไว้ จะไม่มีการนำส่งใด ๆ สำหรับงานmainข้อความจะกลายเป็นเหตุการณ์ระบบwake:"now"ร้องขอ Heartbeat ทันทีหลังจากนำnotify(หรือเหตุการณ์เสร็จสิ้นแบบย่อ) เข้าคิว ส่วน"next-heartbeat"จะนำเหตุการณ์เข้าคิวสำหรับ Heartbeat ครั้งถัดไปstate: สถานะ JSON จำกัดที่ 16 KB และบันทึกถาวรหลังจากการทำงานสำเร็จเท่านั้น การทำงานครั้งถัดไปจะได้รับสำเนาแบบตรึงเป็นtrigger.stateซึ่งสอดคล้องกับสคริปต์ทริกเกอร์ เนื่องจากเนมสเปซนั้นมีเจ้าของสถานะถาวรเพียงรายเดียว เพย์โหลดสคริปต์จึงไม่สามารถใช้ร่วมกับทริกเกอร์แบบมีเงื่อนไขในงานเดียวกันได้nextCheck: ระยะเวลา เช่น"15m"ใช้ได้เฉพาะกับงานที่เปิดใช้การกำหนดจังหวะ และใช้ขีดจำกัดการกำหนดจังหวะเดียวกับข้อเสนอของรอบการทำงานเอเจนต์
การโยนข้อผิดพลาด การหมดเวลา งบประมาณเครื่องมือหมด ผลลัพธ์ไม่ถูกต้อง และ nextCheck ที่ไม่มีการกำหนดจังหวะ ล้วนเป็นข้อผิดพลาดการทำงาน Cron ตามปกติ โดยจะเข้าสู่ประวัติการทำงาน การหน่วงเวลาหลังข้อผิดพลาด และการจัดการการแจ้งเตือนความล้มเหลว โดยไม่บันทึกสถานะที่ส่งคืนไว้อย่างถาวร
รูปแบบการดำเนินการ
| รูปแบบ | ค่า --session |
ทำงานใน | เหมาะที่สุดสำหรับ |
|---|---|---|---|
| เซสชันหลัก | main |
เลนปลุก Cron โดยเฉพาะ | การเตือนความจำ เหตุการณ์ระบบ |
| แบบแยก | isolated |
cron:<jobId> โดยเฉพาะ |
รายงาน งานเบื้องหลัง |
| เซสชันปัจจุบัน | current |
ผูกไว้เมื่อสร้าง | งานประจำที่ตระหนักถึงบริบท |
| เซสชันกำหนดเอง | session:custom-id |
เซสชันที่มีชื่อและคงอยู่ถาวร | เวิร์กโฟลว์ที่ต่อยอดจากประวัติ |
เซสชันหลัก เทียบกับ แบบแยก เทียบกับ กำหนดเอง
งาน เซสชันหลัก จะนำเหตุการณ์ระบบเข้าคิวในเลนการทำงานที่ Cron เป็นเจ้าของ และปลุก Heartbeat หรือไม่ก็ได้ (--wake now หรือ --wake next-heartbeat) งานสามารถใช้บริบทการนำส่งล่าสุดของเซสชันหลักเป้าหมายสำหรับการตอบกลับได้ แต่จะไม่เพิ่มรอบ Cron ตามปกติลงในเลนแชตของมนุษย์ และไม่ต่ออายุความใหม่ของการรีเซ็ตรายวัน/เมื่อไม่มีการใช้งานสำหรับเซสชันเป้าหมาย งาน แบบแยก จะเรียกใช้รอบการทำงานเอเจนต์โดยเฉพาะด้วยเซสชันใหม่ ส่วน เซสชันกำหนดเอง (session:xxx) จะเก็บรักษาบริบทข้ามการทำงาน ทำให้ใช้เวิร์กโฟลว์อย่างการประชุมรายวันแบบยืนที่ต่อยอดจากสรุปก่อนหน้าได้
เหตุการณ์ Cron ของเซสชันหลักเป็นการเตือนความจำแบบเหตุการณ์ระบบที่สมบูรณ์ในตัวเอง โดยจะไม่รวมคำสั่ง "Read HEARTBEAT.md" จากพรอมป์ Heartbeat เริ่มต้นโดยอัตโนมัติ หากการเตือนความจำควรตรวจสอบ HEARTBEAT.md ให้ระบุอย่างชัดเจนในข้อความเหตุการณ์ Cron
ความหมายของ 'เซสชันใหม่' สำหรับงานแบบแยก
แต่ละการทำงานจะมีทรานสคริปต์/รหัสเซสชันใหม่ OpenClaw จะส่งต่อค่ากำหนดที่ปลอดภัย (การตั้งค่าการคิด/เร็ว/ละเอียด ป้ายกำกับ การแทนที่โมเดล/การยืนยันตัวตนที่ผู้ใช้เลือกอย่างชัดเจน) แต่จะไม่สืบทอดบริบทการสนทนาแวดล้อมจากแถว Cron เก่า ได้แก่ การกำหนดเส้นทางช่องทาง/กลุ่ม นโยบายการส่งหรือการเข้าคิว การยกระดับ แหล่งที่มา หรือการผูกรันไทม์ ACP ใช้ current หรือ session:<id> เมื่อต้องการให้งานประจำต่อยอดจากบริบทการสนทนาเดิมโดยตั้งใจ
สัญญาการทำงานแบบไม่มีผู้ดูแล
รอบการทำงานเอเจนต์ของ Cron และฮุกแบบแยกเป็นการทำงานแบบไม่มีผู้ดูแลอย่างชัดเจน ไม่มีผู้ใดอยู่เพื่อชี้แจงหรืออนุมัติ คำตอบสุดท้ายต้องเป็นสิ่งส่งมอบ ไม่ใช่แผน การรับทราบ หรือคำขอข้อมูล เอเจนต์จะส่งคืน HEARTBEAT_OK เมื่อไม่มีสิ่งใดต้องทำและระบุความล้มเหลวอย่างตรงไปตรงมา โดย Cron เป็นเจ้าของนโยบายการลองใหม่และการแจ้งเตือนความล้มเหลว
สำหรับงานตามกำหนดเวลาที่เชื่อถือได้ คำสั่งของงานเองจะมีลำดับความสำคัญเมื่อจงใจขอคำถามหรือแผน และเอเจนต์อาจลบงานที่ไม่จำเป็นอีกต่อไป รอบการทำงานจากฮุกภายนอกจะได้รับเฉพาะสัญญาการทำงานแบบไม่มีผู้ดูแลร่วมกัน โดยจะไม่ได้รับการแทนที่หรือคำแนะนำให้ลบตัวเองนี้ข้ามขอบเขตเนื้อหาภายนอก
การนำส่งของเอเจนต์ย่อยและ Discord
เมื่อการทำงาน Cron แบบแยกประสานงานเอเจนต์ย่อย การนำส่งจะให้ความสำคัญกับเอาต์พุตสุดท้ายของผู้สืบทอดมากกว่าข้อความชั่วคราวเก่าของเอเจนต์แม่ หากผู้สืบทอดยังทำงานอยู่ OpenClaw จะระงับการอัปเดตบางส่วนจากเอเจนต์แม่แทนที่จะประกาศ
สำหรับเป้าหมายการประกาศ Discord ที่เป็นข้อความล้วน OpenClaw จะส่งข้อความสุดท้ายมาตรฐานจากผู้ช่วยเพียงครั้งเดียว แทนการส่งซ้ำทั้งข้อความแบบสตรีม/ระหว่างดำเนินการและคำตอบสุดท้าย ส่วนสื่อและเพย์โหลด Discord แบบมีโครงสร้างยังคงถูกส่งแยกกัน เพื่อไม่ให้ไฟล์แนบและคอมโพเนนต์สูญหาย
การนำส่งและเอาต์พุต
| โหมด | สิ่งที่เกิดขึ้น |
|---|---|
announce |
นำส่งข้อความสุดท้ายไปยังเป้าหมายเป็นทางเลือกสำรอง หากเอเจนต์ไม่ได้ส่ง |
webhook |
POST เพย์โหลดเหตุการณ์เมื่อเสร็จสิ้นไปยัง URL |
none |
ไม่มีการนำส่งสำรองจากตัวรัน |
ใช้ --announce --channel telegram --to "-1001234567890" สำหรับการนำส่งผ่านช่องทาง สำหรับหัวข้อฟอรัม Telegram ให้ใช้ -1001234567890:topic:123; OpenClaw ยังรองรับรูปแบบย่อ -1001234567890:123 ที่ Telegram เป็นเจ้าของด้วย ผู้เรียก RPC/การกำหนดค่าโดยตรงสามารถส่ง 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.failureDestinationตั้งค่าเริ่มต้นส่วนกลางสำหรับการแจ้งเตือนความล้มเหลวjob.delivery.failureDestinationเขียนทับค่านั้นเป็นรายงาน- หากไม่ได้ตั้งค่าทั้งสองรายการและงานนำส่งผ่าน
announceอยู่แล้ว การแจ้งเตือนความล้มเหลวจะย้อนกลับไปใช้เป้าหมายประกาศหลักนั้น delivery.failureDestinationรองรับเฉพาะงานsessionTarget="isolated"เว้นแต่โหมดการนำส่งหลักจะเป็นwebhookfailureAlert.includeSkipped: trueเลือกให้งานหรือนโยบายการแจ้งเตือน cron ส่วนกลางส่งการแจ้งเตือนเมื่อข้ามการทำงานซ้ำ งานที่ถูกข้ามจะมีตัวนับการข้ามติดต่อกันแยกต่างหาก จึงไม่ส่งผลต่อการหน่วงแบบถอยกลับเมื่อเกิดข้อผิดพลาดในการดำเนินการopenclaw cron editเปิดให้ปรับแต่งการแจ้งเตือนเป็นรายงาน ได้แก่--failure-alert/--no-failure-alert,--failure-alert-after <n>,--failure-alert-channel,--failure-alert-to,--failure-alert-cooldown,--failure-alert-include-skipped/--failure-alert-exclude-skipped,--failure-alert-modeและ--failure-alert-account-id
ภาษาของเอาต์พุต
งาน Cron จะไม่อนุมานภาษาสำหรับตอบกลับจากช่องทาง โลแคล หรือข้อความก่อนหน้า ให้ใส่กฎด้านภาษาไว้ในข้อความหรือเทมเพลตตามกำหนดเวลา:
openclaw cron edit <jobId> \ --message "สรุปการอัปเดต ตอบเป็นภาษาจีน โดยคง URL, โค้ด และชื่อผลิตภัณฑ์ไว้เหมือนเดิม"สำหรับไฟล์เทมเพลต ให้คงคำสั่งด้านภาษาไว้ในพรอมต์ที่เรนเดอร์แล้ว และตรวจสอบว่าตัวยึดตำแหน่ง เช่น {{language}} ถูกเติมค่าก่อนงานทำงาน หากเอาต์พุตมีหลายภาษาปะปนกัน ให้ระบุกฎอย่างชัดเจน เช่น: "ใช้ภาษาจีนสำหรับข้อความบรรยายและคงศัพท์เทคนิคเป็นภาษาอังกฤษ"
ตัวอย่าง CLI
การแจ้งเตือนแบบครั้งเดียว
openclaw cron add \ --name "ตรวจสอบปฏิทิน" \ --at "20m" \ --session main \ --system-event "Heartbeat ครั้งถัดไป: ตรวจสอบปฏิทิน" \ --wake nowงานแบบแยกที่เกิดซ้ำ
openclaw cron create "0 7 * * *" \ "สรุปการอัปเดตข้ามคืน" \ --name "สรุปช่วงเช้า" \ --tz "America/Los_Angeles" \ --session isolated \ --announce \ --channel slack \ --to "channel:C1234567890"เขียนทับโมเดลและการคิด
openclaw cron add \ --name "การวิเคราะห์เชิงลึก" \ --cron "0 6 * * 1" \ --tz "America/Los_Angeles" \ --session isolated \ --message "การวิเคราะห์เชิงลึกรายสัปดาห์เกี่ยวกับความคืบหน้าของโครงการ" \ --model "opus" \ --thinking high \ --announceเอาต์พุต Webhook
openclaw cron create "0 18 * * 1-5" \ "สรุปการปรับใช้ของวันนี้เป็น JSON" \ --name "สรุปการปรับใช้" \ --webhook "https://example.invalid/openclaw/cron"เอาต์พุตคำสั่ง
openclaw cron create "*/15 * * * *" \ --name "โพรบความลึกของคิว" \ --command "scripts/check-queue.sh" \ --command-cwd "/srv/app" \ --announce \ --channel telegram \ --to "-1001234567890"การจัดการงาน
# แสดงงานทั้งหมดopenclaw cron list # รับงานที่จัดเก็บไว้หนึ่งงานเป็น JSONopenclaw cron get <jobId> # แสดงงานหนึ่งงาน รวมถึงเส้นทางการนำส่งที่แก้ค่าแล้วopenclaw cron show <jobId> # เปิด/ปิดใช้งานโดยไม่ลบopenclaw cron enable <jobId>openclaw cron disable <jobId> # แก้ไขงานopenclaw cron edit <jobId> --message "พรอมต์ที่อัปเดตแล้ว" --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 * * *" "ตรวจสอบคิวปฏิบัติการ" --name "กวาดตรวจปฏิบัติการ" --session isolated --agent opsopenclaw cron edit <jobId> --clear-agentการเก็บเซสชันเข้าคลัง (ผ่าน Control UI หรือ sessions.patch { archived: true } จากผู้เรียกที่เป็นผู้ดูแลระบบของผู้ปฏิบัติงาน) จะปิดใช้งานงาน cron ที่เปิดใช้งานอยู่ทั้งหมดซึ่งผูกกับเซสชันนั้น ได้แก่ เซสชัน cron:<jobId> แบบแยก เป้าหมาย session:<key> หรือเลนการนำส่ง/ปลุก sessionKey การกู้คืนเซสชันจะไม่เปิดใช้งานงานเหล่านั้นอีกครั้ง ให้ใช้ openclaw cron enable <jobId> เซสชันที่มีงานที่ผูกไว้และเปิดใช้งานอยู่จะแสดงป้ายรูปนาฬิกาในแถบด้านข้างของ Control UI
openclaw cron run <jobId> จะส่งคืนหลังจากเพิ่มการทำงานด้วยตนเองลงในคิว ใช้ --wait สำหรับฮุกปิดระบบ สคริปต์บำรุงรักษา หรือระบบอัตโนมัติอื่นที่ต้องบล็อกจนกว่าการทำงานในคิวจะเสร็จสิ้น โดยจะสำรวจ runId ที่ส่งคืนมา (ระยะหมดเวลาเริ่มต้น 10m, ช่วงเวลาสำรวจ 2s) และออกด้วย 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 เป็นนามแฝงของ openclaw cron add งานใหม่สามารถใช้กำหนดการแบบระบุตำแหน่ง ("0 9 * * 1", "every 1h", "20m" หรือการประทับเวลา ISO) ตามด้วยพรอมต์เอเจนต์แบบระบุตำแหน่ง ใช้ --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 ให้ยกเลิกการตั้งค่าฟิลด์การกำหนดเส้นทางเหล่านั้นทีละรายการ (แต่ละรายการจะถูกปฏิเสธหากใช้ร่วมกับแฟล็กตั้งค่าที่ตรงกัน) ซึ่งต่างจาก --no-deliver ที่ปิดใช้งานเฉพาะการนำส่งสำรองของตัวรัน
Webhook
Gateway สามารถเปิดเผยปลายทาง HTTP Webhook สำหรับทริกเกอร์ภายนอก เปิดใช้งานในการกำหนดค่า:
{ hooks: { enabled: true, token: "shared-secret", path: "/hooks", },}การยืนยันตัวตน
ทุกคำขอต้องมีโทเค็นฮุกผ่านส่วนหัว:
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":"ได้รับอีเมลใหม่","mode":"now"}'textstringrequiredคำอธิบายเหตุการณ์
modestringdefault: nownow หรือ next-heartbeat
POST /hooks/agent
เรียกใช้รอบของเอเจนต์แบบแยก:
curl -X POST http://127.0.0.1:18789/hooks/agent \ -H 'Authorization: Bearer SECRET' \ -H 'Content-Type: application/json' \ -d '{"message":"สรุปกล่องขาเข้า","name":"อีเมล","model":"openai/gpt-5.6-sol"}'ฟิลด์: message (จำเป็น), name, agentId, sessionKey (ต้องใช้ hooks.allowRequestSessionKey=true), idempotencyKey, wakeMode, deliver, channel, to, model, thinking, timeoutSeconds.
OPENCLAW_DOCS_MARKER:accordionOpen:IHRpdGxlPSLguK7guLjguIHguJfguLXguYjguYHguKHguJvguYTguKfguYkgKFBPU1QgL2hvb2tzLzxuYW1l
)">
ชื่อฮุกแบบกำหนดเองจะถูกแปลงผ่าน hooks.mappings ในการกำหนดค่า การแมปสามารถแปลงเพย์โหลดใดๆ เป็นการดำเนินการ wake หรือ agent ด้วยเทมเพลตหรือการแปลงด้วยโค้ด
การผสานรวม Gmail PubSub
เชื่อมทริกเกอร์กล่องจดหมาย Gmail เข้ากับ OpenClaw ผ่าน Google PubSub
การตั้งค่าด้วยตัวช่วยสร้าง (แนะนำ)
openclaw webhooks gmail setup --account openclaw@gmail.comคำสั่งนี้จะเขียนการกำหนดค่า hooks.gmail, เปิดใช้ค่าที่ตั้งไว้ล่วงหน้าสำหรับ Gmail และกำหนดค่าเริ่มต้นเป็น Tailscale Funnel สำหรับตำแหน่งข้อมูลพุช (--tailscale funnel|serve|off)
การเริ่ม Gateway โดยอัตโนมัติ
เมื่อตั้งค่า hooks.enabled=true และ hooks.gmail.account แล้ว Gateway จะเริ่ม gog gmail watch serve ระหว่างการบูตและต่ออายุการเฝ้าดูโดยอัตโนมัติ ตั้งค่า 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
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เริ่มการเฝ้าดู
gog gmail watch start \ --account openclaw@gmail.com \ --label INBOX \ --topic projects/<project-id>/topics/gog-gmail-watchการแทนที่โมเดลสำหรับ Gmail
{ hooks: { gmail: { model: "openai/gpt-5.6-sol", thinking: "high", }, },}สำหรับกล่องจดหมายที่ไม่น่าเชื่อถือ ให้ใช้โมเดลรุ่นล่าสุดในระดับที่ดีที่สุดซึ่งมีจากผู้ให้บริการของคุณ ค่าด้านบนเป็นเพียงตัวอย่าง โมเดลต้องมีอยู่ในแค็ตตาล็อกและรายการอนุญาตที่กำหนดค่าไว้
การกำหนดค่า
{ cron: { enabled: true, store: "~/.openclaw/cron/jobs.json", triggers: { enabled: false, }, webhookToken: "replace-with-dedicated-webhook-token", sessionRetention: "24h", },}webhookToken จะถูกส่งเป็น Authorization: Bearer <token> ในคำขอ POST ของ Webhook Cron
cron.store เป็นคีย์ที่เก็บข้อมูลเชิงตรรกะและพาธการย้ายข้อมูลของ doctor ไม่ใช่ไฟล์ JSON ที่ใช้งานอยู่สำหรับแก้ไขด้วยตนเอง ข้อมูลงานอยู่ใน SQLite ให้ใช้ CLI หรือ API ของ Gateway เพื่อแก้ไข
ปิดใช้ Cron: cron.enabled: false หรือ OPENCLAW_SKIP_CRON=1
ลักษณะการลองใหม่
การลองใหม่สำหรับงานครั้งเดียว: ข้อผิดพลาดชั่วคราว (ขีดจำกัดอัตรา, โหลดเกิน, เครือข่าย, หมดเวลา, ข้อผิดพลาดของเซิร์ฟเวอร์) จะใช้กำหนดการลองใหม่ในตัว ข้อผิดพลาดถาวรจะปิดใช้งานงานทันที
การลองใหม่สำหรับงานที่เกิดซ้ำ: ข้อผิดพลาดในการดำเนินการต่อเนื่องจะเพิ่มระยะหน่วงตามกำหนดการแบบขยาย (30s, 60s, 5m, 15m, 60m) ระยะหน่วงจะรีเซ็ตหลังการทำงานสำเร็จครั้งถัดไป
การบำรุงรักษา
cron.sessionRetention (ค่าเริ่มต้น 24h, false ใช้ปิดการทำงาน) จะล้างรายการเซสชันการทำงานแบบแยก ประวัติการทำงานจะเก็บแถวสถานะสิ้นสุดล่าสุด 2000 แถวต่องาน ส่วนแถวที่สูญหายจะยังคงมีช่วงเวลาล้างข้อมูล 24 ชั่วโมง
การย้ายข้อมูลจากที่เก็บแบบเดิม
เมื่ออัปเกรด ให้เรียกใช้ openclaw doctor --fix เพื่อนำเข้าไฟล์ ~/.openclaw/cron/jobs.json, jobs-state.json และ runs/*.jsonl แบบเดิมเข้าสู่ SQLite และเปลี่ยนชื่อไฟล์เหล่านั้นโดยเติมส่วนต่อท้าย .migrated แถวงานที่มีรูปแบบไม่ถูกต้องจะถูกข้ามระหว่างรันไทม์และคัดลอกไปยัง jobs-quarantine.json เพื่อซ่อมแซมหรือตรวจสอบภายหลัง
การแก้ไขปัญหา
ลำดับคำสั่ง
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
- ความใหม่สำหรับการรีเซ็ตรายวันและเมื่อไม่มีการใช้งานไม่ได้อิงตาม
updatedAtดู การจัดการเซสชัน - การปลุกโดย Cron, การทำงานของ Heartbeat, การแจ้งเตือน exec และการดูแลข้อมูลของ Gateway อาจอัปเดตแถวเซสชันสำหรับการกำหนดเส้นทาง/สถานะ แต่จะไม่ขยาย
sessionStartedAtหรือlastInteractionAt - สำหรับแถวแบบเดิมที่สร้างก่อนมีฟิลด์เหล่านั้น OpenClaw สามารถกู้คืน
sessionStartedAtจากส่วนหัวเซสชัน JSONL ของทรานสคริปต์ได้เมื่อไฟล์ยังพร้อมใช้งาน แถวที่ไม่มีการใช้งานแบบเดิมซึ่งไม่มีlastInteractionAtจะใช้เวลาเริ่มต้นที่กู้คืนได้นั้นเป็นค่าฐานสำหรับช่วงไม่มีการใช้งาน
ข้อควรระวังเกี่ยวกับเขตเวลา
- Cron ที่ไม่มี
--tzจะใช้เขตเวลาของโฮสต์ Gateway - กำหนดการ
atที่ไม่มีเขตเวลาจะถือว่าเป็น UTC - Heartbeat
activeHoursใช้การแก้ค่าเขตเวลาที่กำหนดไว้
เนื้อหาที่เกี่ยวข้อง
- ระบบอัตโนมัติ — กลไกการทำงานอัตโนมัติทั้งหมดโดยสรุป
- งานเบื้องหลัง — บัญชีรายการงานสำหรับการดำเนินการ Cron
- Heartbeat — เทิร์นของเซสชันหลักเป็นระยะ
- เขตเวลา — การกำหนดค่าเขตเวลา