关键词:进程管理|服务监控|日志追踪|自动恢复|权限隔离|状态快照
在现代开发运维中,“部署”只是开始,真正的挑战在于服务的持续运行与可观测性。一个合格的开发者会:
OpenClaw 的 src/agents/process.ts 模块,正是为了让 AI 智能体具备这种全生命周期进程管理能力。它不是简单地调用 ps 或 kill,而是构建了一套语义化、可观察、自愈式的进程控制系统。
本文将详解其核心机制:服务注册、状态感知、日志绑定、安全终止与自动恢复。
直接让 AI 执行 systemctl start app 存在诸多问题:
/var/log/,AI 难以关联process.ts 的目标是:将进程抽象为“受管服务”(Managed Service),提供一致的 CRUD 接口。
ManagedProcess 抽象每个受管进程由一个 ManagedProcess 对象表示:
interface ManagedProcess {
id: string; // 服务 ID,如 "web-server"
cmd: string; // 启动命令,如 "npm run dev"
cwd: string; // 工作目录
env?: Record<string, string>;
port?: number; // 期望监听的端口(用于就绪检测)
logFile?: string; // 日志文件路径(可选)
autoRestart: boolean; // 崩溃是否自动重启
ownerSession: string; // 所属会话(用于租户隔离)
pid?: number; // 当前 PID
status: 'stopped' | 'starting' | 'running' | 'crashed';
lastExitCode?: number;
startTime?: number;
}关键创新:将进程从“操作系统实体”提升为“应用层对象”。
AI 不再说“运行 npm start”,而是:
# SKILL.md 示例
- name: start_web_server
description: "启动开发服务器并等待就绪"
parameters:
port: 3000
command: "npm run dev"startProcess())验证权限:检查 cwd 是否在 allowedPaths 内
派生子进程:
const proc = spawn(cmd, [], { cwd, env: sanitizedEnv });就绪检测(若指定 port):
localhost:port 是否响应crashed绑定日志流:
logFile,自动捕获 stdout/stderrprocess.log 实时推送就绪 ≠ 启动成功:只有端口就绪才视为
running。
传统方式:用户需手动 tail -f nohup.out
OpenClaw 方式:AI 自动关联日志并分析
每个 ManagedProcess 生成唯一 logStreamId
所有输出(stdout/stderr)写入内存环形缓冲区(默认 1000 行)
客户端可通过 ACP 订阅:
{ "method": "process.subscribeLogs", "params": { "processId": "web-server" } }process.ts 内置常见错误关键词检测:
const ERROR_PATTERNS = [
/EADDRINUSE/,
/FATAL ERROR/,
/segmentation fault/,
/Cannot find module/
];
proc.stderr.on('data', (chunk) => {
if (ERROR_PATTERNS.some(p => p.test(chunk))) {
markAsCrashed(processId);
suggestFix(processId, chunk); // 如:“端口被占用,建议换端口或 kill 占用进程”
}
});AI 可基于日志上下文回答:“你的服务因端口冲突崩溃,要我帮你查占用进程吗?”
直接 kill -9 可能导致:
process.ts 实施优雅终止协议:
stopProcess())SIGTERMSIGKILLstoppedownerSession 字段强制校验干净退出,不留痕迹。
对于关键服务,可启用 autoRestart: true:
if (proc.exitCode !== 0 && config.autoRestart) {
if (recentCrashCount > 5) {
disableAutoRestart("Too many crashes"); // 防止无限重启
notifyUser("服务连续崩溃,已暂停自动重启");
} else {
setTimeout(() => startProcess(id), 2000); // 2秒后重启
}
}/healthz)从“一次性执行”到“持续托管”。
exec.ts 的协同:分层职责
exec.ts是“手”,process.ts是“管家”。
# agents/dev-assistant/config.yaml
managedProcesses:
- id: "next-app"
cmd: "npm run dev"
cwd: "/home/user/my-next-app"
port: 3000
autoRestart: true
logFile: "./logs/dev.log" # 可选,否则自动捕获用户指令:
“启动我的 Next.js 应用”
AI 行为:
process.start("next-app")尽管功能强大,process.ts 严格限制风险:
sshd、nginx 等系统服务cwd 必须在 allowedPaths 内exec.ts 的 CPU/内存限制能力越大,约束越明。
process.ts 标志着 OpenClaw 从任务执行者向环境管理者的演进。它不再满足于“运行一次命令”,而是致力于维持一个稳定、可观测、自愈的开发/运行环境。
这正是 AI 智能体走向“真正助手”的关键一步——不仅做事,更懂如何把事做好、做稳、做久。
在下一篇中,我们将探讨 OpenClaw 的技能系统:如何通过
SKILL.md让 AI 学会新能力。
下一篇预告:
第 13 篇:技能即文档 —— SKILL.md 如何让 AI 自主学习新工具