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 นาที - เมื่อ 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 แบบออฟไลน์สามารถกู้คืนจากประวัติถาวรได้ แต่ชุดงานที่กำลังทำงานภายในโปรเซสของ 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)
วันของเดือนและวันของสัปดาห์ใช้ตรรกะ 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: `PR 123 CI: ${trigger.state?.status ?? 'unknown'} -> ${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 ครั้ง
สร้างตัวเฝ้าดูจากไฟล์สคริปต์ในเครื่อง (- อ่านสคริปต์จาก stdin):
openclaw cron add \ --name "ตัวเฝ้าดู PR CI" \ --every 30s \ --trigger-script ./watch-pr-ci.js \ --message "ตอบสนองต่อการเปลี่ยนแปลงสถานะ CI" \ --session isolatedเพย์โหลด
ทุกงานมีเพย์โหลดเพียงหนึ่งชนิด ซึ่งเลือกด้วยแฟล็ก:
| เพย์โหลด | แฟล็ก | การทำงาน |
|---|---|---|
| เหตุการณ์ระบบ | --system-event <text> |
เพิ่มเข้าคิวในเซสชันหลัก โดยไม่เรียกโมเดลด้วยตัวเอง |
| ข้อความเอเจนต์ | --message <text> |
รอบการทำงานของเอเจนต์ที่รองรับโดยโมเดล |
| คำสั่ง | --command <shell> หรือ --command-argv <json> |
เชลล์/โปรเซสบนโฮสต์ Gateway โดยไม่เรียกโมเดล |
ตัวเลือกรอบการทำงานของเอเจนต์
--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 และไม่โพสต์สิ่งใดกลับไปยังแชต
รูปแบบการดำเนินการ
| รูปแบบ | ค่า --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> เมื่อต้องการให้งานประจำต่อยอดจากบริบทการสนทนาเดียวกันโดยเจตนา
การนำส่งจากเอเจนต์ย่อยและ 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>) รหัสห้อง Matrix แยกตัวพิมพ์เล็กและใหญ่ ให้ใช้รหัสห้องที่ตรงกันทุกประการหรือรูปแบบ room:!room:server จาก Matrix
เมื่อการนำส่งแบบประกาศใช้ channel: "last" หรือละเว้น channel เป้าหมายที่มีคำนำหน้าผู้ให้บริการ เช่น telegram:123 สามารถเลือกช่องก่อนที่ Cron จะถอยกลับไปใช้ประวัติเซสชันหรือช่องเดียวที่กำหนดค่าไว้ เฉพาะคำนำหน้าที่ Plugin ซึ่งโหลดอยู่ประกาศรองรับเท่านั้นที่เป็นตัวเลือกผู้ให้บริการ หากระบุ delivery.channel อย่างชัดเจน คำนำหน้าของเป้าหมายต้องระบุผู้ให้บริการเดียวกัน ระบบจะปฏิเสธ channel: "whatsapp" ที่ใช้ร่วมกับ to: "telegram:123" แทนที่จะปล่อยให้ WhatsApp ตีความรหัส 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 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เริ่มการเฝ้าดู
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", maxConcurrentRuns: 8, triggers: { enabled: false, minIntervalMs: 30000, }, retry: { maxAttempts: 3, backoffMs: [30000, 60000, 300000], retryOn: ["rate_limit", "overloaded", "network", "timeout", "server_error"], }, webhookToken: "replace-with-dedicated-webhook-token", sessionRetention: "24h", },}ค่า retry ข้างต้นเป็นค่าเริ่มต้น: ลองใหม่ได้สูงสุด 3 ครั้งโดยใช้การหน่วงเวลาแบบ 30s/60s/5m และลองใหม่สำหรับข้อผิดพลาดชั่วคราวทั้งห้าหมวดหมู่ ระบบจะส่ง webhookToken เป็น Authorization: Bearer <token> ในคำขอ POST ของ Webhook สำหรับ Cron
maxConcurrentRuns จำกัดทั้งการส่งงาน Cron ตามกำหนดเวลาและการดำเนินการรอบเอเจนต์แบบแยก โดยมีค่าเริ่มต้นเป็น 8 ภายในระบบ รอบเอเจนต์ Cron แบบแยกจะใช้ช่องทางดำเนินการ cron-nested เฉพาะของคิว ดังนั้นการเพิ่มค่านี้จะทำให้การเรียกใช้ LLM ของ Cron ที่เป็นอิสระต่อกันดำเนินไปพร้อมกันได้ แทนที่จะเริ่มได้เฉพาะตัวห่อหุ้ม Cron ภายนอกเท่านั้น การตั้งค่านี้ไม่ขยายช่องทาง nested แบบใช้ร่วมกันซึ่งไม่ใช่ Cron
cron.store เป็นคีย์ที่เก็บเชิงตรรกะและพาธการย้ายข้อมูลของ doctor ไม่ใช่ไฟล์ JSON ที่ใช้งานอยู่สำหรับแก้ไขด้วยตนเอง ข้อมูลงานอยู่ใน SQLite ให้ใช้ CLI หรือ Gateway API เพื่อทำการเปลี่ยนแปลง
ปิดใช้งาน Cron: cron.enabled: false หรือ OPENCLAW_SKIP_CRON=1
ลักษณะการลองใหม่
การลองใหม่สำหรับการทำงานครั้งเดียว: ข้อผิดพลาดชั่วคราว (ขีดจำกัดอัตรา, โหลดเกิน, เครือข่าย, หมดเวลา, ข้อผิดพลาดของเซิร์ฟเวอร์) จะลองใหม่สูงสุด retry.maxAttempts ครั้ง (ค่าเริ่มต้น 3) โดยใช้ retry.backoffMs (ค่าเริ่มต้น 30s, 60s, 5m) ข้อผิดพลาดถาวรจะปิดใช้งานงานทันที
การลองใหม่สำหรับงานที่เกิดซ้ำ: ข้อผิดพลาดในการดำเนินการติดต่อกันจะเพิ่มระยะหน่วงตามกำหนดการที่ยาวขึ้น (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, การแจ้งเตือนการดำเนินการ และการทำบัญชีของ Gateway อาจอัปเดตแถวเซสชันสำหรับการกำหนดเส้นทาง/สถานะ แต่จะไม่ขยาย
sessionStartedAtหรือlastInteractionAt - สำหรับแถวแบบเดิมที่สร้างก่อนมีฟิลด์เหล่านั้น OpenClaw สามารถกู้คืน
sessionStartedAtจากส่วนหัวเซสชัน JSONL ของทรานสคริปต์ได้ หากไฟล์ยังพร้อมใช้งาน แถวที่ไม่มีการใช้งานแบบเดิมซึ่งไม่มีlastInteractionAtจะใช้เวลาเริ่มต้นที่กู้คืนนี้เป็นเส้นฐานของการไม่มีการใช้งาน
ข้อควรระวังเกี่ยวกับเขตเวลา
- Cron ที่ไม่มี
--tzจะใช้เขตเวลาของโฮสต์ Gateway - กำหนดการ
atที่ไม่มีเขตเวลาจะถือว่าเป็น UTC - Heartbeat
activeHoursใช้การคำนวณเขตเวลาที่กำหนดค่าไว้
ที่เกี่ยวข้อง
- ระบบอัตโนมัติ — กลไกระบบอัตโนมัติทั้งหมดโดยสรุป
- งานเบื้องหลัง — บัญชีงานสำหรับการดำเนินการ Cron
- Heartbeat — รอบเซสชันหลักเป็นระยะ
- เขตเวลา — การกำหนดค่าเขตเวลา