Gateway
เครื่องมือ exec เบื้องหลังและกระบวนการ
OpenClaw เรียกใช้คำสั่งเชลล์ผ่านเครื่องมือ exec และเก็บงานที่รันนานไว้ในหน่วยความจำ เครื่องมือ process ใช้จัดการเซสชันเบื้องหลังเหล่านั้น
เครื่องมือ exec
พารามิเตอร์สำคัญ:
command(จำเป็น)yieldMs(ค่าเริ่มต้น 10000): ย้ายไปเบื้องหลังโดยอัตโนมัติหลังจากหน่วงเวลานี้background(บูลีน): ย้ายไปเบื้องหลังทันทีtimeout(วินาที, ค่าเริ่มต้นtools.exec.timeoutSec): ฆ่า process หลังหมดเวลานี้; ตั้งtimeout: 0เฉพาะเมื่อต้องการปิด timeout ของ exec process สำหรับการเรียกครั้งนั้นelevated(บูลีน): รันนอก sandbox ถ้าเปิดใช้/อนุญาตโหมด elevated (gatewayโดยค่าเริ่มต้น หรือnodeเมื่อเป้าหมาย exec คือnode)- ต้องการ TTY จริงหรือไม่? ตั้ง
pty: true workdir,env
พฤติกรรม:
- การรันเบื้องหน้าจะคืน output โดยตรง
- เมื่อถูกย้ายไปเบื้องหลัง (ระบุชัดเจนหรือหมดเวลา) เครื่องมือจะคืน
status: "running"+sessionIdและส่วนท้ายสั้นๆ - การรันแบบเบื้องหลังและ
yieldMsจะสืบทอดtools.exec.timeoutSecเว้นแต่การเรียกจะระบุtimeoutชัดเจน - Output จะถูกเก็บไว้ในหน่วยความจำจนกว่าเซสชันจะถูก poll หรือ clear
- ถ้าเครื่องมือ
processไม่ได้รับอนุญาตexecจะรันแบบ synchronous และละเว้นyieldMs/background - คำสั่ง exec ที่ถูก spawn จะได้รับ
OPENCLAW_SHELL=execสำหรับกฎเชลล์/profile ที่รับรู้บริบท - สำหรับงานที่รันนานและเริ่มตอนนี้ ให้เริ่มครั้งเดียวและพึ่งพาการปลุกเมื่อเสร็จสมบูรณ์โดยอัตโนมัติ เมื่อเปิดใช้และคำสั่งมี output หรือ fail
- ถ้าการปลุกเมื่อเสร็จสมบูรณ์โดยอัตโนมัติใช้ไม่ได้ หรือคุณต้องยืนยัน quiet-success สำหรับคำสั่งที่ออกอย่างเรียบร้อยโดยไม่มี output ให้ใช้
processเพื่อยืนยันการเสร็จสมบูรณ์ - อย่าจำลองการเตือนหรือการติดตามผลแบบหน่วงเวลาด้วยลูป
sleepหรือการ polling ซ้ำๆ; ใช้ cron สำหรับงานในอนาคต
การเชื่อม bridge ของ child process
เมื่อ spawn child process ที่รันนานนอกเครื่องมือ exec/process (เช่น การ respawn ของ CLI หรือ helper ของ Gateway) ให้แนบ helper สำหรับ bridge ของ child-process เพื่อส่งต่อสัญญาณ terminate และ detach listener เมื่อ exit/error วิธีนี้ช่วยหลีกเลี่ยง process ค้างบน systemd และทำให้พฤติกรรม shutdown สอดคล้องกันข้ามแพลตฟอร์ม
การ override ด้วย environment:
PI_BASH_YIELD_MS: ค่า yield เริ่มต้น (ms)PI_BASH_MAX_OUTPUT_CHARS: เพดาน output ในหน่วยความจำ (chars)OPENCLAW_BASH_PENDING_MAX_OUTPUT_CHARS: เพดาน stdout/stderr ที่ pending ต่อ stream (chars)PI_BASH_JOB_TTL_MS: TTL สำหรับเซสชันที่เสร็จแล้ว (ms, จำกัดไว้ที่ 1m–3h)
การกำหนดค่า (แนะนำ):
tools.exec.backgroundMs(ค่าเริ่มต้น 10000)tools.exec.timeoutSec(ค่าเริ่มต้น 1800)tools.exec.cleanupMs(ค่าเริ่มต้น 1800000)tools.exec.notifyOnExit(ค่าเริ่มต้น true): เพิ่ม system event เข้าคิว + ขอ Heartbeat เมื่อ exec ที่อยู่เบื้องหลังออกtools.exec.notifyOnExitEmptySuccess(ค่าเริ่มต้น false): เมื่อเป็น true จะเพิ่ม completion event เข้าคิวสำหรับการรันเบื้องหลังที่สำเร็จแต่ไม่มี output ด้วย
เครื่องมือ process
การกระทำ:
list: เซสชันที่กำลังรัน + เสร็จแล้วpoll: ระบาย output ใหม่สำหรับเซสชัน (รายงานสถานะ exit ด้วย)log: อ่าน output ที่รวมไว้ (รองรับoffset+limit)write: ส่ง stdin (data,eofแบบไม่บังคับ)send-keys: ส่งโทเค็นปุ่มหรือไบต์ชัดเจนไปยังเซสชันที่มี PTY รองรับsubmit: ส่ง Enter / carriage return ไปยังเซสชันที่มี PTY รองรับpaste: ส่งข้อความ literal โดยเลือกครอบด้วยโหมด bracketed paste ได้kill: terminate เซสชันเบื้องหลังclear: ลบเซสชันที่เสร็จแล้วออกจากหน่วยความจำremove: kill ถ้ากำลังรันอยู่ มิฉะนั้น clear ถ้าเสร็จแล้ว
หมายเหตุ:
- เฉพาะเซสชันที่อยู่เบื้องหลังเท่านั้นที่จะถูกแสดงรายการ/คงอยู่ในหน่วยความจำ
- เซสชันจะหายไปเมื่อ process restart (ไม่มีการคงอยู่บนดิสก์)
- บันทึกเซสชันจะถูกบันทึกลงประวัติแชทก็ต่อเมื่อคุณรัน
process poll/logและผลลัพธ์ของเครื่องมือถูกบันทึกไว้ processถูกจำกัดขอบเขตต่อ agent; มองเห็นเฉพาะเซสชันที่ agent นั้นเริ่มไว้- ใช้
poll/logสำหรับสถานะ บันทึก การยืนยัน quiet-success หรือการยืนยันการเสร็จสมบูรณ์เมื่อการปลุกเมื่อเสร็จสมบูรณ์โดยอัตโนมัติใช้ไม่ได้ - ใช้
write/send-keys/submit/paste/killเมื่อคุณต้องส่ง input หรือแทรกแซง process listรวมnameที่คำนวณมา (กริยาของคำสั่ง + เป้าหมาย) เพื่อสแกนอย่างรวดเร็วprocess logใช้offset/limitตามบรรทัด- เมื่อไม่ได้ระบุทั้ง
offsetและlimitจะคืน 200 บรรทัดสุดท้ายและรวมคำแนะนำการแบ่งหน้า - เมื่อระบุ
offsetแต่ไม่ได้ระบุlimitจะคืนตั้งแต่offsetจนถึงท้ายสุด (ไม่ถูกจำกัดไว้ที่ 200) - การ polling มีไว้สำหรับสถานะแบบ on-demand ไม่ใช่การจัดตาราง wait-loop ถ้างานควรเกิดขึ้นภายหลัง ให้ใช้ cron แทน
ตัวอย่าง
รันงานยาวและ poll ภายหลัง:
{ "tool": "exec", "command": "sleep 5 && echo done", "yieldMs": 1000 }
{ "tool": "process", "action": "poll", "sessionId": "<id>" }
เริ่มในเบื้องหลังทันที:
{ "tool": "exec", "command": "npm run build", "background": true }
ส่ง stdin:
{ "tool": "process", "action": "write", "sessionId": "<id>", "data": "y\n" }
ส่งปุ่ม PTY:
{ "tool": "process", "action": "send-keys", "sessionId": "<id>", "keys": ["C-c"] }
ส่งบรรทัดปัจจุบัน:
{ "tool": "process", "action": "submit", "sessionId": "<id>" }
วางข้อความ literal:
{ "tool": "process", "action": "paste", "sessionId": "<id>", "text": "line1\nline2\n" }