Automation

งานตามกำหนดเวลา

Cron คือตัวจัดกำหนดการในตัวของ Gateway โดยจะเก็บงานไว้อย่างถาวร ปลุกเอเจนต์ในเวลาที่เหมาะสม และสามารถส่งผลลัพธ์ไปยังช่องแชต Webhook หรือไม่ส่งไปที่ใดเลย

เริ่มต้นอย่างรวดเร็ว

  • เพิ่มการแจ้งเตือนแบบครั้งเดียว

    bash
    openclaw cron create "2027-02-01T16:00:00Z" \  --name "การแจ้งเตือน" \  --session main \  --system-event "การแจ้งเตือน: ตรวจสอบฉบับร่างเอกสาร cron" \  --wake now \  --delete-after-run
  • ตรวจสอบงานของคุณ

    bash
    openclaw cron listopenclaw cron get <job-id>openclaw cron show <job-id>
  • ดูประวัติการทำงาน

    bash
    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 ยกเลิกการทำงานที่รับไว้ ส่วนการทำงานสำรองแบบโลคัลและแบบฝังตัวจะได้รับสัญญาณยกเลิกเดียวกัน สำหรับ GNU timeout ให้เลือกใช้ 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) เพื่อไม่ให้รายงานคำสั่งที่ถูกบล็อกว่าเป็นการทำงานที่สำเร็จ ขณะเดียวกันก็ไม่เข้าใจข้อความร้อยแก้วทั่วไปของผู้ช่วยผิดว่าเป็นการปฏิเสธ
    • ความล้มเหลวของเอเจนต์ระดับการทำงานจะนับเป็นข้อผิดพลาดของงานแม้ไม่มีเพย์โหลดตอบกลับ ดังนั้นความล้มเหลวของโมเดล/ผู้ให้บริการจะเพิ่มตัวนับข้อผิดพลาดและเรียกใช้การแจ้งเตือนความล้มเหลว แทนการล้างงานว่าเสร็จสมบูรณ์
    • เมื่องานถึง timeoutSeconds cron จะยกเลิกการทำงานและให้ช่วงเวลาสั้น ๆ สำหรับล้างข้อมูล หากการทำงานไม่สิ้นสุดงานที่ค้างอยู่ การล้างข้อมูลที่ 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

    bash
    # เจตนา: "9 นาฬิกาของวันที่ 15 เฉพาะเมื่อเป็นวันจันทร์"# ผลจริง: "9 นาฬิกาของทุกวันที่ 15 และ 9 นาฬิกาของทุกวันจันทร์"0 9 15 * 1

    คำสั่งนี้จะเริ่มทำงานประมาณ 5-6 ครั้งต่อเดือน แทนที่จะเป็น 0-1 ครั้งต่อเดือน หากต้องการให้ตรงตามทั้งสองเงื่อนไข ให้ใช้ตัวแก้ไขวันของสัปดาห์ + ของ croner (0 9 15 * +1) หรือจัดกำหนดการตามฟิลด์หนึ่งและตรวจสอบอีกฟิลด์ในพรอมต์หรือคำสั่งของงาน

    ทริกเกอร์เหตุการณ์ (ตัวเฝ้าดูเงื่อนไข)

    ทริกเกอร์เหตุการณ์จะเพิ่มสคริปต์เงื่อนไขแบบไม่มีส่วนติดต่อไปยังกำหนดการ every หรือ cron Cron จะประเมินสคริปต์เมื่องานถึงกำหนด และเรียกใช้เพย์โหลดตามปกติเฉพาะเมื่อสคริปต์ส่งคืน fire: true:

    json5
    {  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):

    bash
    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 จะส่งการแทนที่โมเดลสำรองแบบว่าง แทนที่จะแอบเพิ่มโมเดลหลักของเอเจนต์เป็นเป้าหมายสำหรับลองใหม่

    ลำดับความสำคัญในการเลือกโมเดลสำหรับงานแบบแยก เรียงจากสูงสุด:

    1. เพย์โหลดรายงาน model (การกำหนดค่าอย่างชัดเจน โมเดลที่ไม่ได้รับอนุญาตจะทำให้การรันล้มเหลว)
    2. การแทนที่โมเดลของฮุก Gmail (เฉพาะเมื่อการรันมาจาก Gmail และอนุญาตให้ใช้การแทนที่นั้น)
    3. การแทนที่โมเดลของเซสชัน Cron ที่ผู้ใช้เลือกและจัดเก็บไว้
    4. การเลือกโมเดลของเอเจนต์/โมเดลเริ่มต้น

    โหมดเร็วจะใช้การเลือกที่แก้ไขแล้วในขณะรัน หากการกำหนดค่าของโมเดลที่เลือกมี 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 เดียวกับงานเทิร์นของเอเจนต์มาใช้ซ้ำ

    bash
    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" เว้นแต่โหมดการส่งหลักจะเป็น webhook
    • failureAlert.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 จะไม่อนุมานภาษาที่ใช้ตอบจากช่องทาง โลเคล หรือข้อความก่อนหน้า ให้ใส่กฎด้านภาษาไว้ในข้อความหรือเทมเพลตที่กำหนดเวลาไว้:

    bash
    openclaw cron edit <jobId> \  --message "สรุปข้อมูลอัปเดต ตอบเป็นภาษาจีน และคง URL โค้ด และชื่อผลิตภัณฑ์ไว้โดยไม่เปลี่ยนแปลง"

    สำหรับไฟล์เทมเพลต ให้คงคำสั่งด้านภาษาไว้ในพรอมต์ที่เรนเดอร์แล้ว และตรวจสอบว่ามีการใส่ค่าให้ตัวแทนข้อความ เช่น {{language}} ก่อนที่งานจะทำงาน หากผลลัพธ์มีหลายภาษาปะปนกัน ให้ระบุกฎอย่างชัดเจน เช่น "ใช้ภาษาจีนสำหรับข้อความบรรยาย และคงศัพท์เทคนิคไว้เป็นภาษาอังกฤษ"

    ตัวอย่าง CLI

    การเตือนครั้งเดียว

    bash
    openclaw cron add \  --name "ตรวจสอบปฏิทิน" \  --at "20m" \  --session main \  --system-event "Heartbeat ถัดไป: ตรวจสอบปฏิทิน" \  --wake now

    งานแยกที่ทำซ้ำ

    bash
    openclaw cron create "0 7 * * *" \  "สรุปข้อมูลอัปเดตช่วงข้ามคืน" \  --name "สรุปช่วงเช้า" \  --tz "America/Los_Angeles" \  --session isolated \  --announce \  --channel slack \  --to "channel:C1234567890"

    แทนที่โมเดลและระดับการคิด

    bash
    openclaw cron add \  --name "การวิเคราะห์เชิงลึก" \  --cron "0 6 * * 1" \  --tz "America/Los_Angeles" \  --session isolated \  --message "วิเคราะห์ความคืบหน้าของโครงการเชิงลึกประจำสัปดาห์" \  --model "opus" \  --thinking high \  --announce

    ผลลัพธ์ Webhook

    bash
    openclaw cron create "0 18 * * 1-5" \  "สรุปการปรับใช้ของวันนี้เป็น JSON" \  --name "สรุปการปรับใช้" \  --webhook "https://example.invalid/openclaw/cron"

    ผลลัพธ์คำสั่ง

    bash
    openclaw cron create "*/15 * * * *" \  --name "ตรวจสอบความลึกของคิว" \  --command "scripts/check-queue.sh" \  --command-cwd "/srv/app" \  --announce \  --channel telegram \  --to "-1001234567890"

    การจัดการงาน

    bash
    # แสดงงานทั้งหมด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 สำหรับทริกเกอร์ภายนอก เปิดใช้งานในการกำหนดค่า:

    json5
    {  hooks: {    enabled: true,    token: "shared-secret",    path: "/hooks",  },}

    การยืนยันตัวตน

    ทุกคำขอต้องมีโทเค็นฮุกผ่านส่วนหัว:

    • Authorization: Bearer <token> (แนะนำ)
    • x-openclaw-token: <token>

    โทเค็นในสตริงคำค้นจะถูกปฏิเสธ

    POST /hooks/wake

    นำเหตุการณ์ระบบเข้าคิวสำหรับเซสชันหลัก:

    bash
    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: now

    now หรือ next-heartbeat

    POST /hooks/agent

    เรียกใช้รอบการทำงานของเอเจนต์แบบแยก:

    bash
    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

    การตั้งค่าด้วยตัวช่วย (แนะนำ)

    bash
    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 ใช้:

    bash
    gcloud auth logingcloud config set project <project-id>gcloud services enable gmail.googleapis.com pubsub.googleapis.com
  • สร้างหัวข้อและให้สิทธิ์การเข้าถึง Gmail push

    bash
    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
  • เริ่มการเฝ้าดู

    bash
    gog gmail watch start \  --account openclaw@gmail.com \  --label INBOX \  --topic projects/<project-id>/topics/gog-gmail-watch
  • การแทนที่โมเดล Gmail

    json5
    {  hooks: {    gmail: {      model: "openai/gpt-5.6-sol",      thinking: "high",    },  },}

    สำหรับกล่องจดหมายที่ไม่น่าเชื่อถือ ให้ใช้โมเดลรุ่นล่าสุดระดับดีที่สุดที่ผู้ให้บริการของคุณมีให้ใช้ ค่าข้างต้นเป็นเพียงตัวอย่าง โมเดลต้องมีอยู่ในแค็ตตาล็อกและรายการที่อนุญาตซึ่งคุณกำหนดค่าไว้

    การกำหนดค่า

    json5
    {  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 เพื่อซ่อมแซมหรือตรวจสอบในภายหลัง

    การแก้ไขปัญหา

    ลำดับคำสั่ง

    bash
    openclaw statusopenclaw gateway statusopenclaw cron statusopenclaw cron listopenclaw cron runs --id <jobId> --limit 20openclaw system heartbeat lastopenclaw logs --followopenclaw doctor
    Cron ไม่ทำงานตามกำหนด
    • ตรวจสอบ 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 ใช้การคำนวณเขตเวลาที่กำหนดค่าไว้

    ที่เกี่ยวข้อง

    Was this useful?
    On this page

    On this page