Background Exec + Process Tool

OpenClaw는 exec tool을 통해 셸 명령을 실행하고, 장기 실행 작업을 메모리에 유지합니다. process tool은 이러한 백그라운드 세션을 관리합니다.

exec tool

주요 매개변수:

  • command (필수)
  • yieldMs (기본값 10000): 이 지연 시간 이후 자동 백그라운드 전환
  • background (bool): 즉시 백그라운드로 전환
  • timeout (초, 기본값 1800): 이 시간 초과 후 프로세스를 종료
  • elevated (bool): elevated 모드가 활성화/허용된 경우 host에서 실행
  • 실제 TTY가 필요하신가요? pty: true로 설정하세요.
  • workdir, env

동작:

  • 포그라운드 실행은 출력을 직접 반환합니다.
  • 백그라운드로 전환되면(명시적 또는 타임아웃), tool은 status: "running" + sessionId와 짧은 tail을 반환합니다.
  • 세션이 폴링되거나 삭제될 때까지 출력이 메모리에 유지됩니다.
  • process tool이 허용되지 않으면, exec은 동기적으로 실행되고 yieldMs/background를 무시합니다.

Child process bridging

exec/process tool 외부에서 장기 실행 child process를 생성할 때(예: CLI 재생성 또는 gateway helper), child-process bridge helper를 연결하여 종료 signal이 전달되고 exit/error 시 listener가 분리되도록 하세요. 이렇게 하면 systemd에서 고아 프로세스를 방지하고 플랫폼 간 종료 동작을 일관되게 유지할 수 있습니다.

환경 재정의:

  • PI_BASH_YIELD_MS: 기본 yield (ms)
  • PI_BASH_MAX_OUTPUT_CHARS: 메모리 내 출력 용량 (문자)
  • OPENCLAW_BASH_PENDING_MAX_OUTPUT_CHARS: 스트림당 보류 중인 stdout/stderr 용량 (문자)
  • PI_BASH_JOB_TTL_MS: 완료된 세션의 TTL (ms, 1m–3h로 제한)

Config (권장):

  • tools.exec.backgroundMs (기본값 10000)
  • tools.exec.timeoutSec (기본값 1800)
  • tools.exec.cleanupMs (기본값 1800000)
  • tools.exec.notifyOnExit (기본값 true): 백그라운드 exec이 종료되면 system event를 enqueue하고 heartbeat를 요청합니다.

process tool

작업:

  • list: 실행 중 + 완료된 세션
  • poll: 세션의 새 출력을 drain합니다 (종료 상태도 보고)
  • log: 집계된 출력을 읽습니다 (offset + limit 지원)
  • write: stdin 전송 (data, 선택적 eof)
  • kill: 백그라운드 세션 종료
  • clear: 메모리에서 완료된 세션 제거
  • remove: 실행 중이면 kill, 완료되었으면 clear

참고:

  • 백그라운드로 전환된 세션만 메모리에 목록화/유지됩니다.
  • 프로세스 재시작 시 세션이 손실됩니다 (디스크 지속성 없음).
  • Session log는 process poll/log를 실행하고 tool 결과가 기록될 때만 채팅 기록에 저장됩니다.
  • process는 agent별로 범위가 지정됩니다. 해당 agent가 시작한 세션만 표시됩니다.
  • process list에는 빠른 검색을 위해 파생된 name (명령 동사 + 대상)이 포함됩니다.
  • process log는 line 기반 offset/limit을 사용합니다 (마지막 N개 line을 가져오려면 offset 생략).

예제

장기 작업을 실행하고 나중에 폴링:

{"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"}