OpenClaw 彻底卸载指南:从服务治理到残留清理的完整架构实践
标签: #OpenClaw #AIAgent #系统清理 #架构治理 #DevOps
一、为什么卸载 OpenClaw 不是"删文件夹"这么简单
作为本地 AI Agent 运行时,OpenClaw 的架构设计遵循了持久化服务模式而非普通桌面应用。它在你系统中埋设了多层钩子:
- 网关守护进程(Gateway):以 launchd/systemd/计划任务形式常驻后台
- 状态目录(State Dir):~/.openclaw 存储配置、凭证、会话缓存
- 工作区(Workspace):~/.openclaw/workspace 存放 Agent 生成的记忆文件与技能数据
- CLI 工具链:通过 npm/pnpm/bun 全局安装的二进制文件
直接 rm -rf 删除安装目录或执行 npm uninstall 会导致服务僵尸化------网关进程仍在后台持有端口,重启后自动复活,甚至造成后续版本冲突。本文基于官方卸载文档 ,提供两条互补的清理路径。
二、卸载路径决策架构
根据 CLI 工具是否可用,选择不同的治理策略:
md
┌─────────────────────────────────────────────────────────────┐
│ 开始卸载流程 │
└────────────────────┬────────────────────────────────────────┘
│
▼
┌──────────────────────┐
│ 执行 which openclaw │
└──────────┬───────────┘
│
┌───────────┴───────────┐
│ │
返回路径 无返回
(CLI可用) (CLI已删)
│ │
▼ ▼
┌──────────────┐ ┌──────────────────┐
│ 简单路径 │ │ 手动清理路径 │
│ 官方卸载命令 │ │ 服务单元手动移除 │
└──────┬───────┘ └────────┬─────────┘
│ │
└───────────┬───────────┘
▼
┌──────────────────────┐
│ 清理状态目录与 │
│ 工作区残留文件 │
└──────────┬───────────┘
│
▼
┌──────────────────────┐
│ 验证清理完整性 │
│ 吊销API密钥 │
└──────────────────────┘
三、路径一:官方优雅卸载(CLI 可用状态)
若 openclaw 命令仍可响应,优先使用内置卸载器,这是最安全的声明式清理方案。
3.1 一键非交互卸载(推荐用于 CI/CD 与自动化脚本)
bash
openclaw uninstall --all --yes --non-interactive
或通过 npx 直接调用最新版本执行卸载,避免本地 CLI 损坏:
bash
npx -y openclaw uninstall --all --yes --non-interactive
参数解析:
- --all:连带删除网关服务、本地数据库、配置文件,而非仅移除二进制
- --yes:自动确认所有危险操作,避免交互阻塞
- --non-interactive:禁用 TTY 依赖,适合脚本化执行
3.2 分步精细化卸载(适合排查问题)
若需观察每步执行细节,按以下顺序操作:
Step 1:停止网关服务
bash
openclaw gateway stop
确保无进程持有 ~/.openclaw 目录句柄,避免后续删除出现 Device or resource busy。
Step 2:卸载系统服务单元
bash
openclaw gateway uninstall
此命令自动识别操作系统,执行反向注册:
- macOS:移除 ~/Library/LaunchAgents/ai.openclaw.gateway.plist
- Linux:禁用并删除 ~/.config/systemd/user/openclaw-gateway.service
- Windows:删除任务计划程序中的 "OpenClaw Gateway" 任务
Step 3:清理状态与配置目录
bash
rm -rf "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}"
若曾设置自定义配置路径 OPENCLAW_CONFIG_PATH,需同步删除:
bash
rm -f "$OPENCLAW_CONFIG_PATH"
Step 4:清理 Agent 工作区(可选但建议)
bash
rm -rf ~/.openclaw/workspace
此目录包含 AGENTS.md、MEMORY.md 等 Agent 记忆文件,若需保留历史对话数据可跳过。
Step 5:移除全局 CLI
根据安装方式选择对应命令:
bash
# npm 用户
npm rm -g openclaw
# pnpm 用户
pnpm remove -g openclaw
# bun 用户
bun remove -g openclaw
Step 6:移除 macOS 原生应用(如安装过)
bash
rm -rf /Applications/OpenClaw.app
3.3 多 Profile 环境的特殊处理
若使用过 --profile 参数或 OPENCLAW_PROFILE 环境变量创建多隔离环境,每个 Profile 拥有独立状态目录 ~/.openclaw-。需对每个 Profile 重复执行 Step 3:
bash
# 清理默认环境
rm -rf ~/.openclaw
# 清理生产环境 Profile
rm -rf ~/.openclaw-production
# 清理测试环境 Profile
rm -rf ~/.openclaw-staging
四、路径二:手动清理(CLI 已丢失但服务残留)
常见于先执行了 npm rm -g openclaw 但未清理服务,导致网关仍在后台运行。此时需手动干预系统服务层。
md
┌──────────────────────────────────────────────────┐
│ 手动清理路径架构图 │
│ │
│ ┌─────────────┐ ┌─────────────┐ ┌────────┐ │
│ │ macOS │ │ Linux │ │Windows│ │
│ │ launchd │ │ systemd │ │Task │ │
│ │ │ │ │ │Sch │ │
│ └──────┬──────┘ └──────┬──────┘ └───┬────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ bootout gui/UID/ disable --now /Delete /F │
│ ai.openclaw.gateway openclaw-gateway "OpenClaw│
│ .service Gateway" │
│ │ │ │ │
│ └──────────────────┼───────────────┘ │
│ │ │
│ ▼ │
│ 删除 plist/service/ │
│ 脚本文件 │
└──────────────────────────────────────────────────┘
4.1 macOS 平台(launchd)
bash
# 停止并卸载服务(默认标签为 ai.openclaw.gateway)
launchctl bootout gui/$UID/ai.openclaw.gateway
# 删除 plist 文件
rm -f ~/Library/LaunchAgents/ai.openclaw.gateway.plist
# 若使用自定义 Profile,替换标签名
launchctl bootout gui/$UID/ai.openclaw.production
rm -f ~/Library/LaunchAgents/ai.openclaw.production.plist
# 检查遗留的旧版命名(com.openclaw.*)
launchctl list | grep openclaw
rm -f ~/Library/LaunchAgents/com.openclaw.*.plist
4.2 Linux 平台(systemd 用户级服务)
bash
# 停止并禁用服务
systemctl --user disable --now openclaw-gateway.service
# 删除服务单元文件
rm -f ~/.config/systemd/user/openclaw-gateway.service
# 重载 systemd 配置
systemctl --user daemon-reload
# 多 Profile 情况处理
systemctl --user disable --now openclaw-gateway-production.service
rm -f ~/.config/systemd/user/openclaw-gateway-production.service
4.3 Windows 平台(任务计划程序)
以管理员身份执行 PowerShell:
powershell
# 强制删除计划任务
schtasks /Delete /F /TN "OpenClaw Gateway"
# 删除启动脚本
Remove-Item -Force "$env:USERPROFILE\.openclaw\gateway.cmd" -ErrorAction SilentlyContinue
# 多 Profile 处理
schtasks /Delete /F /TN "OpenClaw Gateway (production)"
Remove-Item -Force "$env:USERPROFILE\.openclaw-production\gateway.cmd"
五、源码安装的特殊卸载顺序
若通过 git clone 源码运行,顺序至关重要:
md
┌──────────────────────────────────────────┐
│ 源码卸载执行顺序 │
│ │
│ 1. 卸载网关服务(按路径一或二执行) │
│ ↓ │
│ 2. 删除源码目录 (rm -rf openclaw/) │
│ ↓ │
│ 3. 清理状态目录与 Workspace │
└──────────────────────────────────────────┘
严禁在网关服务仍在运行时直接删除源码目录,这将导致 systemd/launchd 指向不存在的二进制文件,产生顽固的服务错误日志。
六、验证检查清单
执行完卸载后,通过以下命令验证系统洁净度:
| 检查项 | 命令 | 预期结果 |
|---|---|---|
| CLI 移除 | which openclaw |
command not found |
| 服务状态 (macOS) | `launchctl list | grep openclaw` |
| 服务状态 (Linux) | systemctl --user status openclaw-gateway |
Unit could not be found |
| 服务状态 (Win) | schtasks /Query /TN "OpenClaw Gateway" |
ERROR: The specified task does not exist |
| 状态目录 | ls ~/.openclaw |
No such file or directory |
| Profile 残留 | ls ~/.openclaw-* |
No such file or directory |
七、安全后处理:密钥吊销
OpenClaw 会在 ~/.openclaw 中缓存 LLM Provider 的 API Key(OpenAI、Claude、Gemini 等)。即便目-录已删除,若曾提交到代码仓库或备份,建议执行密钥轮换:
- 登录对应 LLM Provider 控制台
- 吊销旧 Key(标注为 openclaw- 前缀的密钥)
- 检查 .bash_history 或 .zsh_history 中是否残留 export OPENCLAW_API_KEY= 明文,执行 history -c 清理当前会话历史
八、结语
OpenClaw 的卸载过程体现了云原生本地服务的治理复杂度------它并非简单的二进制文件,而是渗透在进程管理、用户目录、系统服务中的分布式组件集合。遵循官方推荐的声明式卸载流程,比暴力删除更能保持系统环境的纯净。
对于频繁切换 Agent 框架的开发者,建议将 OpenClaw 状态目录通过 OPENCLAW_STATE_DIR 环境变量重定向到独立分区或 Docker Volume,未来清理时仅需卸载容器或格式化卷即可实现零残留卸载。
仅供学习参考,请勿用于商业用途。