1. 卸载了 OpenClaw为什么任务管理器里它还在跑如果你在控制面板里点了卸载重启后打开任务管理器依然能看到openclaw或claw字样的进程占着 CPU、内存甚至开机后风扇狂转——这不是错觉也不是杀毒软件误报。OpenClaw 这类带 Agent 调度能力的工具安装时通常会注册常驻服务、开机自启项和计划任务卸载程序只删了主程序目录服务注册表和 LaunchDaemon 里的条目往往被漏掉。结果就是文件没了服务还在尝试拉起一个不存在的可执行文件系统反复重试资源就这么被吃掉了。这篇面向已经卸载 OpenClaw、但机器仍有异常占用的开发者。我会按「诊断 → 停服务 → 杀进程 → 禁自启 → 验证」的顺序给出 Windows、macOS、Linux 三端可直接复制的命令并顺带把 TaoToken 统一 Key/API 通道的config.toml骨架整理出来——因为很多人清理完残留后下一步就是重新配置模型接入与其到处散落 Key不如一次收口。适合谁装过 OpenClaw、现在想彻底清干净、同时希望把模型调用统一到一个入口的人。先明确一个判断标准卸载 ≠ 停止服务。只要服务注册项还在系统每次开机都会尝试启动它哪怕二进制文件已经被删。所以排查的第一步不是删文件而是找出「谁还在引用 OpenClaw」。2. 诊断找出残留的进程、服务与开机启动项在动手清理前先把现场摸清楚。不同系统查法不同但目标一致进程、端口、服务、自启项四类。2.1 Windows 端诊断查进程和命令行重点看Path和CommandLine确认是不是残留Get-Process | Where-Object {$_.Name -like *claw*} | Select-Object Name, Id, CPU, WorkingSet, Path Get-CimInstance Win32_Process | Where-Object {$_.Name -like *claw*} | Select-Object Name, ProcessId, CommandLine, ExecutablePath查端口占用OpenClaw 常用 8080主服务和 9090Agentnetstat -ano | findstr :8080 netstat -ano | findstr :9090查服务、计划任务、启动项三件套Get-Service | Where-Object {$_.Name -like *claw*} | Select-Object Name, Status, StartType Get-ScheduledTask | Where-Object {$_.TaskName -like *claw*} Get-CimInstance Win32_StartupCommand | Where-Object {$_.Name -like *claw*}2.2 macOS 端诊断macOS 的残留主要藏在 LaunchDaemon系统级和 LaunchAgent用户级里ps aux | grep -i claw | grep -v grep sudo lsof -i :8080 sudo lsof -i :9090 ls /Library/LaunchDaemons/ | grep claw ls ~/Library/LaunchAgents/ | grep claw launchctl list | grep claw2.3 Linux 端诊断systemd 是重灾区另外别忘了 crontabps aux | grep -i claw | grep -v grep ss -tulpn | grep claw systemctl list-unit-files | grep claw systemctl list-units --typeservice | grep claw ls /etc/init.d/ | grep claw crontab -l | grep claw sudo cat /etc/crontab | grep claw ls /etc/cron.d/ | grep claw提示诊断阶段不要急着 kill先把输出记下来。后面清理完要拿同样的命令做对比才能确认真的清干净了。3. 彻底关闭停服务、杀进程、禁自启清理顺序很重要先停服务再杀进程最后禁自启。顺序反了你刚杀完进程服务又把它拉起来。3.1 第一阶段停止运行中的服务Windows 用 PowerShell 批量停注意Stop-Service失败时用 WMI 拿 PID 强杀$services (OpenClaw,OpenClawAgent,ClawScheduler,ClawDaemon) foreach ($svc in $services) { Stop-Service -Name $svc -Force -ErrorAction SilentlyContinue $s Get-Service -Name $svc -ErrorAction SilentlyContinue if ($s -and $s.Status -eq Running) { $wmi Get-CimInstance Win32_Service -Filter Name$svc if ($wmi) { Stop-Process -Id $wmi.ProcessId -Force -ErrorAction SilentlyContinue } } } Get-Service | Where-Object {$_.Name -like *claw*} | Select-Object Name, Status, StartTypemacOS 用launchctl unload卸载 plist再remove掉注册for plist in /Library/LaunchDaemons/com.openclaw.*; do [ -f $plist ] || continue name$(basename $plist .plist) sudo launchctl unload $plist 2/dev/null sudo launchctl remove $name 2/dev/null done for plist in ~/Library/LaunchAgents/com.openclaw.*; do [ -f $plist ] || continue name$(basename $plist .plist) launchctl unload $plist 2/dev/null launchctl remove $name 2/dev/null done launchctl list | grep clawLinux 停 systemd 服务并 disable同时处理 SysVinitfor svc in $(systemctl list-units --typeservice | grep claw | awk {print $1}); do sudo systemctl stop $svc sudo systemctl disable $svc done for init in /etc/init.d/*claw*; do [ -f $init ] || continue sudo service $(basename $init) stop done sudo systemctl daemon-reload sudo systemctl reset-failed systemctl list-units | grep claw3.2 第二阶段结束残留进程服务停了进程可能还在。先温和后强制# Windows Get-Process | Where-Object {$_.Name -like *claw*} | ForEach-Object { $_.CloseMainWindow() | Out-Null } Start-Sleep -Seconds 2 Get-Process | Where-Object {$_.Name -like *claw*} | Stop-Process -Force $left Get-Process | Where-Object {$_.Name -like *claw*} if ($left) { $left | Select-Object Name, Id } else { Write-Host 已清空 }# macOS / Linux pkill -TERM -f openclaw; sleep 2 pkill -KILL -f openclaw for pid in $(ps aux | grep -i claw | grep -v grep | awk {print $2}); do sudo kill -9 $pid 2/dev/null done pgrep -f openclaw /dev/null ps aux | grep -i claw | grep -v grep || echo 已清空3.3 第三阶段禁用开机启动这一步是防止重启后复发。Windows 要同时处理服务自启、计划任务、注册表 Run 键和启动文件夹foreach ($svc in (OpenClaw,OpenClawAgent,ClawScheduler)) { Set-Service -Name $svc -StartupType Disabled -ErrorAction SilentlyContinue sc.exe config $svc start disabled | Out-Null } Get-ScheduledTask | Where-Object {$_.TaskName -like *claw*} | ForEach-Object { Unregister-ScheduledTask -TaskName $_.TaskName -Confirm:$false } $keys (HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run, HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Run) foreach ($k in $keys) { Get-ItemProperty $k | Get-Member -MemberType NoteProperty | Where-Object {$_.Name -like *claw*} | ForEach-Object { Remove-ItemProperty -Path $k -Name $_.Name } }macOS 删除 plist 并 disablefor plist in /Library/LaunchDaemons/com.openclaw.*; do [ -f $plist ] || continue name$(basename $plist .plist) sudo launchctl disable system/$name 2/dev/null sudo rm $plist done for plist in ~/Library/LaunchAgents/com.openclaw.*; do [ -f $plist ] || continue name$(basename $plist .plist) launchctl disable gui/$(id -u)/$name 2/dev/null rm $plist doneLinux 用mask彻底屏蔽再删服务文件和 cron 条目for svc in $(systemctl list-unit-files | grep claw | awk {print $1}); do sudo systemctl disable $svc sudo systemctl mask $svc 2/dev/null done sudo rm -f /etc/systemd/system/openclaw* /usr/lib/systemd/system/openclaw* sudo rm -f /etc/init.d/*claw* /etc/cron.d/*claw* sudo systemctl daemon-reload (crontab -l 2/dev/null | grep -v claw) | crontab -4. 清理后重新配置TaoToken 统一 Key/API 通道残留清干净后如果你还要继续用模型能力建议把 Key 和 API 入口统一收口避免下次换工具时又散落一地。TaoToken 提供统一的 API 通道官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基址为 https://taotoken.net/api 。先到控制台创建 Keyhttps://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。接入文档参考 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。下面是一个config.toml骨架把 base_url 和 key 集中管理工具侧只引用环境变量# ~/.config/taotoken/config.toml [default] base_url https://taotoken.net/api api_key ${TAOTOKEN_API_KEY} timeout 60 [models] default claude-sonnet fallback gpt-4o-mini [agent] max_retries 3 log_level info配合环境变量写入Linux/macOS 写进~/.zshrc或~/.bashrcexport TAOTOKEN_API_KEYsk-你的KeyWindows PowerShell 持久化[Environment]::SetEnvironmentVariable(TAOTOKEN_API_KEY,sk-你的Key,User)注意不要把 Key 硬编码进config.toml提交到 Git。用${VAR}引用环境变量换机器时只改环境变量即可。如果你主要做长期编码或 Agent 调度可以看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。想先在网页里验证模型是否通用模型对话https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。5. 验证请求与重启后资源占用对比配置写完后先用一条 curl 验证通道是否通curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer $TAOTOKEN_API_KEY \ -H Content-Type: application/json \ -d { model: claude-sonnet, messages: [{role:user,content:ping}] }返回里能看到choices字段就说明 Key 和 base_url 都对。如果返回 401检查 Key 是否带空格返回 404检查 base_url 是否漏了/api。接着做资源占用对比这是判断清理是否成功的硬指标。清理前先记一组数据# Windows 清理前 Get-Process | Where-Object {$_.Name -like *claw*} | Measure-Object -Property WorkingSet -Sum# macOS / Linux 清理前 ps aux | grep -i claw | grep -v grep | awk {sum$6} END {print sum/1024 MB}重启系统后用同样的命令再跑一次。预期结果是进程列表为空内存合计为 0端口 8080/9090 不再被监听。如果还有残留回到第 3 节检查是不是漏了计划任务或 cron。# 重启后验证 pgrep -f openclaw echo 仍有残留 || echo 清理完成 sudo lsof -i :8080 sudo lsof -i :90906. 本篇常见错排查错误一Stop-Service报「服务无法停止」。通常是服务进程卡死。用Get-CimInstance Win32_Service拿到 PID 后Stop-Process -Force再sc.exe delete 服务名删掉注册项。错误二macOSlaunchctl remove报「Operation not permitted」。系统级 LaunchDaemon 需要sudo用户级 LaunchAgent 不要加 sudo否则会以 root 身份注册到错误域。错误三Linuxsystemctl mask后服务仍显示。mask只是屏蔽启动已加载的 unit 需要systemctl daemon-reload刷新。如果还不行systemctl reset-failed清掉失败状态。错误四清理完端口仍被占用。可能是 TIME_WAIT 状态等 30 秒自动释放也可能是别的进程复用了 8080。用netstat -ano | findstr :8080拿 PID 反查进程名别误杀。错误五config.toml里${TAOTOKEN_API_KEY}没被替换。说明工具不支持变量展开改成在启动脚本里export后由工具读取环境变量或直接用envsubst生成临时配置。错误六重启后 OpenClaw 进程又出现。检查是不是有父进程在拉起它比如某个 IDE 插件或 supervisor。用Get-CimInstance Win32_Process看ParentProcessId顺藤摸瓜。清理这类残留核心就一句话服务、进程、自启项三者要一起清缺一个都会复发。我自己的习惯是清理完把诊断命令存成一个check_residual.sh每次装完新工具跑一遍比事后救火省事得多。