
OpenClaw国内玩 AI Agent 的朋友更喜欢叫它“龙虾”这套开源的智能体框架我三个月前部署在一台 Ubuntu 服务器上。当初选它是看重一键安装体验好能接 Teams、接 Obsidian、能挂云服务器远程调度半天就能跑起一个能办事的 agent。但最近资源占用和维护成本越来越不可控我准备换一套更适合个人使用的方案就决定把它彻底卸掉。原以为卸载就是删个目录的事真正动手才发现比安装复杂三倍。这篇东西记录了我整个卸载过程。如果你也在 Linux尤其是 Ubuntu/Debian上部署过 OpenClaw现在因为环境还原、换方案或者只是单纯想清理磁盘而打算卸载我的经验应该能帮你少走不少弯路。从命令行怎么卸到配置文件残留、systemd 自启、Docker 镜像卷清理再到那个折磨我很久的agent failed before reply: session file locked (timeout 60000ms)报错我都会讲清楚原因和处置方法。1. 装龙虾容易卸龙虾难先说清楚为什么要认真对待卸载1.1 一个“curl | bash”装完的东西卸载时凭什么到处是坑当时我用的是官方提供的一键部署脚本体验确实好一条管道命令敲完几分钟就起来了。但问题也埋在这里一键脚本做的事情远不只是放一个可执行文件。它会在/opt或/usr/local下解压程序会往 systemd 里注册一个openclaw.service会在你的 HOME 目录下创建.openclaw配置目录还可能顺手拉起来一组 Docker 容器来跑周边服务。装的时候像流水线卸的时候却像考古。脚本运行过程中不会输出详细的安装日志自然也不会给你一张“反向清单”。我一开始以为只要找到openclaw命令然后删掉就完事结果命令行里删掉了端口还开着端口处理了开机自启的服务还在服务清了配目录里还躺着一堆会话数据库。这就是我写这篇指南的初衷把整个生命周期里的落点全部找出来一个不剩。1.2 残留不清理会造成哪些实际后果很多人觉得“反正我不用了留点垃圾无所谓”。实测下来OpenClaw 的残留会带来这几个真实问题端口被旧进程或旧容器占着。重新部署其他服务时一直提示Address already in use排查半天才发现是龙虾的容器还在后台跑。配置目录里的 API 密钥、会话令牌没删干净。这些文件默认权限通常只有当前用户可读但一旦账号被入侵泄露的就是真实凭证不是普通日志。systemd 服务残留导致开机自动拉起一个已经不存在的程序。黑屏弹日志、服务反复重启失败、journalctl刷屏非常烦人。Docker 镜像和 volume 占用磁盘。我这边一个客户端镜像加数据卷加起来 4GB 多不清理磁盘永远少一块。PATH 里挂着失效命令路径。每次开终端都提示command not found或者打字时 shell 自动补全出一个不存在的命令名。最典型的就是 session 锁残留。旧进程没退干净锁文件还留在会话目录里重装或迁移数据时疯狂报agent failed before reply: session file locked (timeout 60000ms)后面我会单独讲这个问题。所以结论只有一个卸载 OpenClaw不能只删主程序必须做一轮完整的残留清理。2. 动手前的三步准备卸载是个“先搞清楚再动手”的活2.1 确认安装方式对症才能下药OpenClaw 在不同环境下有三种主流装机路径Docker 部署、npm 全局安装、源码/一键脚本安装。卸载方式差异很大所以第一步永远是确认它到底是怎么装进去的。我建议按下面这套命令挨个跑一遍# 1. 命令行里找 openclaw 本体 which openclaw type -a openclaw ls -l $(which openclaw) # 2. 看 Docker 容器和镜像 docker ps -a | grep -i openclaw docker images | grep -i openclaw # 3. 查 npm / pip 全局包 npm ls -g --depth0 2/dev/null | grep -i openclaw pip show openclaw 2/dev/null # 4. 常见目录扫一遍 ls -d /opt/openclaw /usr/local/openclaw ~/.openclaw 2/dev/nullwhich查出来的是当前 PATH 里优先命中的路径type -a则能把 alias、内置命令、PATH 里的所有候选都列出来。很多一键脚本会同时装 CLI 和 Docker 服务所以which和docker ps都可能命中两条线索都不能漏。把这四组命令的输出汇总一下基本就能确定安装方式了。我整理了一张速查表安装方式主要痕迹卸载重点Docker / docker-compose容器、镜像、volume、network容器编排文件所在目录的 compose 项目npm 全局安装which openclaw指向 npm bin 目录全局包和符号链接源码 / 一键脚本/opt、/usr/local、HOME 下有程序目录源码目录和 systemd 服务pip / condaPython 包记录虚拟环境或全局包2.2 备份会话记录和配置卸载不可逆别赌卸载本身不可逆真的删了rm -rf之后会话历史、agent 的配置、API 密钥这些数据就再也找不回来了。我在动手前做了一个带时间戳的备份mkdir -p ~/backup/openclaw-$(date %F) cp -r ~/.openclaw ~/backup/openclaw-$(date %F)/ 2/dev/null cp -r ~/.config/openclaw ~/backup/openclaw-$(date %F)/ 2/dev/null tar czf ~/backup/openclaw-$(date %F).tar.gz ~/backup/openclaw-$(date %F)这一步不是可有可无。我见过有人卸载时没备份后来想迁移数据到新环境发现旧会话全没了肠子都悔青。即便你确定不再用 OpenClaw把配置目录压成一个 tar 包扔在备份盘里成本也就几分钟关键时刻能救命。2.3 停服务清锁文件前先让进程死透备份完先别急着删目录得让系统里的 OpenClaw 相关进程先停下来。这一步非常关键正在运行的进程会占用 session 文件锁你不先停掉后面删目录时会遇到Permission denied更糟的是删除过程中旧进程又把文件写回去了。# 停 systemd 服务如果有 systemctl status openclaw.service sudo systemctl stop openclaw.service # 停 Docker 编排如果有 cd /path/to/openclaw-deploy-dir docker compose down # 兜底处理所有残留进程 pkill -f openclaw ps aux | grep -i openclaw停完之后再确认监听端口已经释放ss -tlnp | grep -E (:8080|:3000) # 替换成你实际配置的端口如果端口还开着说明进程没死干净一般kill -9终结掉对应 PID 就行。先让进程死透、再谈删除这个顺序绝对不能反过来。3. 正式卸载四种安装方式分场景处理3.1 Docker / docker-compose 部署的卸载流程如果你当时是用 docker-compose 部署的docker compose down只是把容器停掉镜像、卷、网络都还在。完整的卸载流程我建议这样走cd /path/to/openclaw-deploy-dir docker compose down # 停止并移除容器 docker ps -a | grep -i openclaw # 逐一确认容器已消失 docker rm -f container_id # 有残留就强制删除 docker images | grep -i openclaw docker rmi image_id # 删除相关镜像 docker volume ls | grep -i openclaw docker volume rm volume_name # 删数据卷这步最容易漏docker compose down不带-v参数时默认不会删除 volume。数据卷里可能存着会话数据库、向量索引、日志这才是磁盘大头。如果你确认数据不需要保留可以在down时直接加-v但更稳妥的做法是单独查看docker volume ls确认名称后再删避免误伤同一个 Docker 环境里的其他项目。3.2 npm 全局安装的卸载如果which openclaw指向的是/usr/bin或/usr/local/bin下的软链接目标文件在 node_modules 里那你走的是 npm 全局安装。卸载命令很简单npm ls -g --depth0 | grep -i openclaw # 先确认确切包名 npm uninstall -g openclaw/cli # 包名以实际输出为准 # 当初用 sudo 装的卸载也要 sudo sudo npm uninstall -g openclaw/cli这里的坑在于包名不一定叫openclaw。我当时用npm ls -g查出来是openclaw/cli如果你环境里是别名包或者 scoped 包直接npm uninstall -g openclaw会提示找不到。另外npm 卸载后偶尔会在 bin 目录留下空的软链接文件手动清理一下即可ls -l /usr/local/bin/openclaw rm -f /usr/local/bin/openclaw hash -rhash -r是刷新 shell 的命令哈希表防止终端里还缓存着旧的命令路径。3.3 源码 / 一键脚本安装的清理一键脚本安装的痕迹最分散清理也要最仔细。这类安装方式通常把程序主体放在/opt/openclaw或者~/.openclaw下同时在/usr/local/bin建一个软链接。删除步骤# 删除程序主体目录 rm -rf /opt/openclaw rm -rf ~/.openclaw/source ~/.openclaw/bin # 删除命令行软链接 rm -f /usr/local/bin/openclaw rm -f /usr/local/bin/claw # 如果当初是 git clone 源码编译的源码目录也删掉 rm -rf ~/openclaw ~/projects/openclaw这里有个更聪明的做法先翻一遍安装脚本本身。大多数一键脚本会写清楚它都创建了哪些路径、写了哪些 systemd unit、改了哪个环境变量文件。把脚本下载下来 grep 一遍install、mkdir、ln -s、systemctl这些关键词就能得到一份“卸载清单”。我在处理时就是把当初的脚本存了一份对照着删基本没走弯路。3.4 pip / conda 等其他方式安装少部分人是在 Python 虚拟环境里跑 OpenClaw 的这种情况就简单多了pip show openclaw pip uninstall openclaw # conda 环境 conda remove -n openclaw-env --allpip show会输出Location这能告诉你包装到了哪个 site-packages。如果当初是在 venv 里装的最干净的做法是直接把整个虚拟环境目录删掉然后再删 pip 包双保险。4. 残留清理卸载干净与否的分水岭4.1 配置、数据、日志目录速查清单这部分是我踩坑最多的区域。OpenClaw 会在很多位置落东西我整理了一张路径速查表每一项都建议检查一下路径里面是什么删除建议~/.openclaw主配置、会话、agent 状态备份后删除~/.config/openclaw应用配置备份后删除~/.cache/openclaw缓存、临时锁文件可直接删除~/.local/share/openclaw会话数据库、向量索引备份后删除/var/lib/openclaw服务端数据备份后删除/var/log/openclaw运行日志可直接删除/etc/openclaw全局配置备份后删除对应删除命令rm -rf ~/.openclaw ~/.config/openclaw ~/.cache/openclaw ~/.local/share/openclaw sudo rm -rf /var/lib/openclaw /var/log/openclaw /etc/openclaw我特别提醒一下~/.local/share/openclaw。很多用户不知道这个目录的存在但它往往保存着最核心的会话数据库。如果你之前做过数据备份这个目录就放心删如果没备份请先 cp 出来再删。4.2 清理 systemd 服务和开机自启一键脚本最常见的“后手”就是注册 systemd 服务。不清理的话服务器重启后 systemd 会尝试拉起一个程序文件已经不存在的服务然后反复失败刷日志。清理命令systemctl status openclaw.service sudo systemctl disable --now openclaw.service # 删除 service 文件 sudo rm -f /etc/systemd/system/openclaw.service rm -rf ~/.config/systemd/user/openclaw.service # 重新加载配置 sudo systemctl daemon-reload这里还要查一遍 systemd timer。有些版本会注册定时任务做心跳检查systemctl list-timers | grep -i openclaw顺带把 crontab 里的相关条目也查一下crontab -l | grep -i openclaw大多数情况下 crontab 是干净的但 chkrootkit 式检查总比事后发现问题强。4.3 别名、环境变量和定时任务的清理安装脚本可能会往 shell 配置里写东西比如在~/.bashrc里加一行export PATH$HOME/.openclaw/bin:$PATH或者设置一个alias ocopenclaw。删除程序本体后这些配置不会自己消失反而会在终端里留下“僵尸命令”。grep -n openclaw ~/.bashrc ~/.zshrc ~/.profile ~/.bash_profile 2/dev/null把命中的行注释或删除后记得运行source ~/.bashrc重新加载。我建议在修改前先把这几个文件备份一下改坏了还能恢复。4.4 Docker 镜像、卷、网络的收尾如果你用的是 Docker 部署删除容器后还要处理镜像、卷、网络。用几个命令看看整体账单docker system df docker image ls | grep -i openclaw docker volume ls | grep -i openclaw docker network ls | grep -i openclaw有命中就逐一清理docker image rm image_id docker volume rm volume_name docker network rm network_name不要一上来就docker system prune -a那会把环境里所有未使用的镜像和卷都清掉一旦同一台机器上还有其他项目容易误伤。老老实实按名字删最安全。5. 卸载结果验证给环境做一次“体检”5.1 四组命令快速验证删完之后不验证等于白删。我最常用四组命令来做快速体检# 1. 命令本体 command -v openclaw # 无输出 成功 openclaw --version # 应提示 command not found # 2. 进程 ps aux | grep -i openclaw # 无输出 成功 # 3. 端口 ss -tlnp | grep -E (:8080|:3000) # 原监听端口应无输出 # 4. 定时任务与自启 systemctl status openclaw.service # 提示 unit not found 成功command -v比which更准确它能覆盖 alias 和函数的情况。如果command -v openclaw没输出但openclaw还能敲出来说明存在 alias 或者 shell 函数残留继续清。5.2 用关键词深挖文件系统残留文件不一定在常规路径里。我的做法是在全盘范围按文件名关键词扫一遍sudo find / \( -iname *openclaw* -o -iname *claw* \) \ -not -path /proc/* -not -path /sys/* -not -path /dev/* 2/dev/null | head -50这条命令输出可能比较吵因为claw会命中一些无关文件但你可以人工过滤一下。另外检查账号和用户组getent group | grep -i openclaw getent passwd | grep -i openclaw如果安装脚本创建过专用用户比如openclaw最好一并删除用户和用户组sudo userdel -r openclaw sudo groupdel openclaw5.3 卸载前后对比表我实测的差异我把自己机器上卸载前后的状态整理成了表格你可以对照着自己环境判断是否彻底检查项卸载前卸载后command -v openclaw/usr/local/bin/openclaw无输出监听端口 8080被 openclaw 占用无监听docker images含 openclaw2 个镜像0 个docker volume ls含 openclaw2 个卷0 个systemd 服务active (running)unit not found~/.openclaw目录存在约 3.2GB已删除ps aux含 openclaw多个进程无输出整个过程下来我这台机器释放了大约 6GB 磁盘终端恢复干净重启也不会再弹错误。6. 踩坑实录session file locked 与那些卸载后的“幽灵”6.1 agent failed before reply: session file locked (timeout 60000ms) 到底怎么回事这个报错是我卸载前遇到的也是很多人在重装或切换模型时经常撞上的钉子。它的字面意思是agent 框架尝试打开会话文件但在 60 秒内拿不到锁。常见原因有三个旧进程没退干净锁一直被某个僵尸进程占着。用ps aux | grep openclaw一定能找到。锁文件残留但持有者已消失。程序被强杀比如kill -9、断电时.lock文件会留在会话目录里。权限不匹配。之前用 root 跑过后来改用普通用户普通用户没权限覆盖 root 创建的锁文件。处理顺序是先查进程再清锁最后才考虑整个会话目录ps aux | grep -i openclaw sudo kill -9 pid # 找到 session 目录清除锁文件 find ~/.openclaw -name *.lock -delete如果你的会话数据不重要直接备份后把整个 session 目录删掉最省事。这个报错的元凶往往是“卸载顺序”反了没停服务就先删程序锁文件反而留下来了。按我第二、三节的顺序走基本不会再遇到它。6.2 systemd 服务删了还在自启有次我删掉openclaw.service并daemon-reload之后重启系统发现日志里又在尝试连接 OpenClaw 的端口。排查后发现是安装脚本注册了一个 user 级 systemd 服务我光删了 system 级忘了~/.config/systemd/user/里的那份。systemctl --user status openclaw.service systemctl --user disable --now openclaw.service rm -f ~/.config/systemd/user/openclaw.service systemctl --user daemon-reload另外要留意WantedBy依赖如果其他服务比如multi-user.target或某个监控服务里声明了Wantsopenclaw.service删掉主 unit 还不够得把依赖条目也清掉。用systemctl list-unit-files | grep openclaw查一遍最保险。6.3 端口被占但找不到进程卸载完 Docker 部署后我一度发现端口还是被占用但lsof -i :8080什么都查不到。最后是用ss -tlnp看到监听者写着docker-proxy。原因很简单docker-proxy 进程还在为已经删除的容器服务或者网络命名空间没释放干净容器虽然删了但进程还挂在旧的 namespace 里。处理方式ss -tlnp | grep 8080 sudo kill -9 docker-proxy-pid # 如果还不行查命名空间残留 sudo lsns | grep -i openclaw多数情况下重启一次 Docker 服务systemctl restart docker就能把这些孤儿进程清干净。这个坑告诉我验证卸载时别只盯程序和文件端口和进程这一层也要过一遍。6.4 明明删了还能执行 openclaw删掉二进制后我试着敲openclaw --version居然还有输出。查了一圈发现是三个原因叠加shell 的 hash 表缓存了旧路径、~/.bashrc里有个 alias、/usr/local/lib下还有个没删干净的符号链接。hash -r # 清 hash 表 type -a openclaw # 列出所有可能来源 unalias openclaw 2/dev/nullhash -r是个很实用的命令凡是“文件删了但命令还在”的情况先跑它基本能解决一半。另一半就是 alias 和软链接用type -a一眼就能看穿。6.5 一个提醒别顺手清理你还在用的公共组件卸载 OpenClaw 时有人在网上建议“把 Python、Node.js、Docker 全卸了重装”。千万不要这么干。这些是公共基础组件其他项目都在用。我卸载时最多删掉 OpenClaw 专用的虚拟环境和全局包系统自带的 Python、npm 本体一概不动。卸载要精准打击目标而不是伤及无辜。7. 关于这次卸载我最真实的几条体会折腾完这一圈我最深的感受是卸载比安装更需要纪律。装的时候一条命令跑完你根本不知道脚本往系统里塞了什么卸的时候每一步都得反过来把账算清楚。所以我现在部署任何新工具都会顺手把安装时执行过的命令和历史输出录到一个 Markdown 文件里这比卸载时靠find满世界找残留轻松一百倍。如果你正准备卸载 OpenClaw我给一个可复用的顺序停服务、卸程序、清配置、删数据、验残留。每一步做完再走下一步别贪快。备份永远不嫌多能用mv到 backup 目录就别直接rm -rf给自己留条后路。最后再分享一个小技巧用script命令把整个卸载过程录下来。操作前先执行script /tmp/uninstall-openclaw.log完成后再输入exit结束录屏。万一中途操作失误还能回放日志看看是哪一步出了问题。工具本身是个不错的选择但如果你到了一个需要卸载它的阶段希望这篇指南能帮你走得干净、走得利落。