1. 日常维护之前:先搞清楚你的OpenClaw部署形态
先说个容易被忽略的点:OpenClaw 的“日常维护命令”不是一套命令打天下。你装在 Windows 上用 Companion 跑,和塞进 Termux 里跑安卓版,或者挂在 ROS2 Humble 环境里配合 Gazebo 仿真用,初始化方式、进程管理方式、日志路径都不一样。如果上来就照着 Docker 那套 systemctl 命令去折腾,很可能连服务都找不到。
我接触 OpenClaw 的时间不算短,从最早的裸机脚本部署,到后来用 Ollama 做本地推理、再到帮朋友配安卓手机上的 Termux 版本,前前后后踩了不少坑。今天这篇文章,我就把日常维护里最高频、最实用的命令整理成一套“速查手册”,顺便把每个命令背后的原因也讲清楚。不是简单罗列,而是让你知道为什么用这个命令、什么时候该用、踩坑了怎么救。
需要提前说明的是,OpenClaw 本身没有锁死某一种部署方式。官方支持“原生进程”和“容器化”两种主要运行形态,而社区里常见的安卓部署(Termux)其实也是原生进程的一种特例。所以下面的命令我会按“原生进程为主、容器为辅”的方式展开,再单独给 Termux 和 Windows Companion 场景做标注。你自己对照当前环境选着用就行。
1.1 三种典型部署形态:原生进程、容器化、Termux 安卓端
原生进程部署是最直观的形态。你把 OpenClaw 的源码或者编译好的二进制放在某个目录,然后用命令行直接启动。这种形态下,维护命令的核心就是“找到进程、控制进程、看日志”。优点是简单直接,缺点是进程一旦崩溃,没有任何守护机制,需要借助 systemd 或者 supervisor 这类工具来保活。
容器化部署(Docker / Docker Compose)则把 OpenClaw 和它的依赖封装成镜像。日常维护主要围绕 docker 命令展开,比如docker ps、docker logs、docker compose restart。这种形态的好处是环境隔离、迁移方便,坏处是排查问题的时候多了一层“容器内 vs 容器外”的复杂度。你如果用的是 Docker 部署,下面的原生进程命令可能要对应改成docker exec才能生效。
Termux 安卓端是另一个热闹的方向。很多人在手机上装 Termux,跑 OpenClaw 的 Android 版。这种形态本质上还是原生进程,但是 Termux 对后台进程的管理比较特殊,系统在内存不足时有可能会把 Termux 整个杀掉。所以安卓端的维护命令,除了常规的进程操作,还涉及到 Termux 的termux-wake-lock、termux-battery-status这类辅助命令。
1.2 维护命令的“入口”在哪里:CLI 工具与配置文件
OpenClaw 正常安装完成后,会提供一个主命令openclaw,后面可以跟各种子命令。比如openclaw status、openclaw logs、openclaw update等等。这个 CLI 工具实际上是维护操作的总入口,所有常规的启停、更新、状态查看都可以通过它完成,不需要你手动去 kill 进程或者找日志文件。
不过 CLI 命令能够做到的事情终究有限,更深层的维护仍然绕不开配置文件。OpenClaw 的核心配置默认放在用户主目录下的.openclaw/目录中,里面会有类似config.yaml或config.json的文件,用来管理模型接入(比如 Ollama 的地址、API Key)、技能(skills)目录、对话历史存储路径、日志级别等。
我个人的习惯是,每次维护之前先用openclaw config --show看一眼当前生效的配置,确认没有被人改过或者出现奇怪的字段。配置文件是维护工作的地图,地图错了,后面的命令全部白搭。
1.3 环境变量与配置管理的基础
在 OpenClaw 里,不少运行参数可以通过环境变量覆盖配置文件中的默认值。比如OPENCLAW_LOG_LEVEL控制日志详细程度,OPENCLAW_MODEL指定默认模型,OPENCLAW_OLLAMA_HOST指定 Ollama 服务地址。为什么需要了解这些?因为日常维护中有一类高频操作就是“临时调日志级别看问题”,如果你不知道环境变量覆盖规则,就只能手改配置文件再重启,费时费力。
我用一个生活中的类比来解释:配置文件像是你手机里的“设置”菜单,环境变量则是你在特定场景下临时拉起的“快捷开关”。快捷开关只在本次运行时生效,重启后回到设置菜单的状态。也就是说,OPENCLAW_LOG_LEVEL=debug openclaw start这种命令只会在启动的这一次进程里输出详细日志,不会把配置文件永久改成 debug 级别。
2. 高频日常维护命令:状态查看、启停与更新
日常维护里,用得最多的就是状态查看和启停操作。很多时候你收到告警说 OpenClaw 不回复了,第一反应不是去改代码,而是先看它到底还活着没有。这一节我把状态查看、启动停止、版本更新这三类高频操作拆开讲,每个都给出实际命令和排障思路。
2.1 查看运行状态与健康检查
最简单直接的命令是:
openclaw status这个命令会输出进程是否运行、PID、运行时长、当前内存占用、监听的端口、当前加载的模型等信息。如果输出中能看到running字样,说明主进程是正常的。但“进程活着”不等于“服务健康”,你还需要进一步确认内部任务调度是否正常。我建议配合下面这个健康检查接口一起看:
curl http://127.0.0.1:8080/healthOpenClaw 默认会起一个本地 HTTP 服务,/health端点会返回 JSON,比如{"status":"ok","model":"qwen2.5:7b","uptime_seconds":12345}。如果这个接口能通,基本可以说明主服务和模型连接都没问题。如果status显示 running,但/health超时,那大概率是模型推理线程卡死了,属于“假活”状态。
在 Docker 部署形态下,命令要换成:
docker ps --filter name=openclaw docker logs --tail 50 openclaw2.2 启动、停止与重启的正确姿势
停止 OpenClaw 有一个比较重要的讲究:尽量不要直接kill -9进程。因为 OpenClaw 在处理对话任务时会产生临时状态,强制杀进程可能导致对话记录没有落盘,甚至让 SQLite 数据库出现损坏。
正确做法是:
openclaw stop这个命令会先向主进程发送 SIGTERM 信号,让它有机会完成当前任务的保存收尾,再退出。如果stop之后进程仍然没有退出(偶尔会发生),再用openclaw stop --force兜底。启动则很简单:
openclaw start如果你用 systemd 托管,那么对应的命令就是systemctl --user start openclaw、systemctl --user stop openclaw、systemctl --user restart openclaw。注意 OpenClaw 官方推荐以用户态 systemd 服务方式运行,因为这样就可以开机自启且崩溃自动重启。
重启命令我单独说一下:openclaw restart实际上等价于stop加start,但它会额外检查配置文件语法,如果配置文件有错会拒绝启动,并且回滚到停止前状态,避免“停了起不来”的尴尬。所以日常版本更新后、配置调整后,我都建议用openclaw restart而不是手动stop && start。
2.3 版本升级与回滚操作
OpenClaw 的迭代速度比较快,社区热词里也经常出现“OpenClaw部署”、“OpenClaw安装配置”这类话题。升级操作本身并不复杂:
openclaw update这个命令会从官方源拉取最新版本,然后执行迁移脚本。迁移脚本主要用来升级配置文件格式和数据库结构。所以我特别提醒:升级之前务必先做备份(备份命令在下一节详细讲)。
升级过程中如果报错,最常见的原因是旧配置里的某个字段在新版本中已经被废弃。这时候 OpenClaw 会给出类似Deprecated key: model.temperature的警告,但不会中断升级。你可以升级后再用openclaw config migrate --dry-run检查配置兼容性。
如果需要回滚版本,OpenClaw 提供了版本快照能力:
openclaw update --rollback这个命令会回退到上一个稳定版本,并且自动恢复升级前的配置备份。不过回滚不是万能的,如果数据库已经因为升级产生了不可逆的结构变化,那么回滚之后可能面临数据读不出来的情况。所以版本升级真的是“备份先行”,别偷懒。
3. 日志、备份与数据维护
日志是排查问题的第一手资料,备份是灾难恢复的救命稻草。这一节我会讲清楚 OpenClaw 日志怎么看、如何备份对话历史与模型配置、SQLite 数据库怎么维护。这些命令不像启停那么高频,但每次用上的时候基本都是在救火。
3.1 日志查看与轮转策略
OpenClaw 的日志默认保存在~/.openclaw/logs/目录下,按天切分,文件名为openclaw-YYYY-MM-DD.log。查看当前日志可以直接用:
openclaw logs --tail 50这等价于tail -n 50 ~/.openclaw/logs/openclaw-$(date +%F).log。如果你在调试某个特定技能(skill)或某个 API 接入问题,建议带上时间过滤:
openclaw logs --since "10 minutes ago"日志级别默认是INFO,排查问题时可以先临时调到DEBUG:
OPENCLAW_LOG_LEVEL=debug openclaw start这样不会永久修改配置。确认问题之后,重启正常服务即可。
还有一个容易被忽略的点:日志轮转。OpenClaw 默认只保留最近 7 天的日志文件,但如果你处理的任务量很大,一天的日志可能就有几百 MB。我建议自行配置 logrotate 或者定期清理:
openclaw logs --clean --keep 3这条命令会删除 3 天前的日志,释放磁盘空间。在容器部署下,对应的操作是docker logs --tail结合外部 logrotate,不过一般 Docker 部署建议直接让 OpenClaw 的日志写到挂载卷里,再对挂载卷做轮转。
3.2 对话历史与模型配置备份
OpenClaw 的对话历史、技能配置、用户偏好都存储在~/.openclaw/目录下,其中最关键的是history.db(SQLite 数据库)和config.yaml。备份这两个文件就等于备份了整个 OpenClaw 的“记忆”。
我常用的备份命令是:
# 创建备份目录 mkdir -p ~/openclaw-backups # 带时间戳备份整个配置目录 tar -czf ~/openclaw-backups/openclaw-$(date +%Y%m%d-%H%M%S).tar.gz -C ~ .openclaw注意tar命令里的-C ~是为了把备份路径里的前缀去掉,这样还原的时候直接解压到~目录即可。如果你只关心对话数据,可以只备份history.db:
cp ~/.openclaw/history.db ~/openclaw-backups/history-$(date +%Y%m%d).db但这里有一个重要的坑:SQLite 在运行状态下直接cp可能会得到一个不一致的快照,尤其是当写入任务正在执行时。稳妥做法是先用openclaw stop停服务再备份,或者使用 SQLite 的在线备份命令:
sqlite3 ~/.openclaw/history.db ".backup '~/openclaw-backups/history-online.db'"这条命令是 SQLite 官方支持的在线热备方式,即使服务正在运行也能保证一致性。
3.3 数据库(SQLite)维护命令
OpenClaw 的元数据存储默认使用 SQLite,日常维护中偶尔需要手动检查数据库完整性。最常用的维护命令是:
# 检查数据库完整性 sqlite3 ~/.openclaw/history.db "PRAGMA integrity_check;"返回ok就说明数据库没问题;如果返回database disk image is malformed,那就得用备份恢复了。另外,随着对话记录增多,SQLite 可能会出现膨胀,建议定期执行 VACUUM 来回收空闲空间:
sqlite3 ~/.openclaw/history.db "VACUUM;"VACUUM会重建数据库文件,期间不能有写入操作,所以最好在openclaw stop之后进行。执行完成后,你会发现history.db文件明显变小。这个操作属于“优化型维护”,频率不用太高,每周或者每月一次就行。
4. 资源监控与性能调优
很多 OpenClaw 的日常故障并不是代码 bug,而是资源不够用。尤其是你在安卓 Termux 上部署,或者同时跑多个技能的时候,内存和 CPU 很容易被吃满。这一节我讲讲怎么监控资源占用,以及几个有效的性能调优思路。
4.1 CPU、内存、GPU 占用排查
当你觉得 OpenClaw 响应变慢时,第一步是看资源占用,而不是重装。原生进程部署下,最直接的命令是:
ps aux | grep openclaw关注%CPU和%MEM两列。如果 OpenClaw 进程的 CPU 占用长期超过 100%,说明推理任务可能陷入了死循环;如果内存占用持续上涨却不回落,大概率存在内存泄漏,这通常需要升级版本或者重启进程来释放。
如果你配置了 Ollama 作为本地推理引擎,还要额外检查 Ollama 的资源占用。因为 OpenClaw 本身不承载推理,它只是把任务发给 Ollama。很多情况下模型加载在 Ollama 侧,GPU 显存被模型占满之后,新的推理请求就会排队,表现出来就是 OpenClaw 回复很慢。
GPU 占用排查命令(以 NVIDIA 为例):
nvidia-smi重点关注MiB显存占用和%GPU利用率。如果你看到显存被占满但利用率很低,说明模型已经加载但没有处理请求,此时可以考虑让 Ollama 闲置时自动卸载模型(OLLAMA_KEEP_ALIVE=0)。
4.2 模型缓存与 Ollama 配置调优
Ollama 的模型文件默认保存在~/.ollama/models目录下,占用空间相当可观。一个 7B 参数的模型通常需要 4~6GB 空间,如果你同时加载多个模型,磁盘瞬间就爆了。
常用的维护命令:
# 查看已下载的模型列表 ollama list # 删除不用的模型 ollama rm qwen2.5:7b # 修改默认并发数 export OLLAMA_NUM_PARALLEL=2OLLAMA_NUM_PARALLEL是 Ollama 的一个重要参数,默认值是 1,也就是同时只能处理一个请求。如果你有多用户使用 OpenClaw,可以调大这个值,但要注意显存或者内存的承受能力。我有一次把并发数调到 4,结果 8GB 显存的卡直接被 OOM,进程被系统杀掉,日志里报的是CUDA out of memory,排查了很久才发现是并发数的问题。
对于“OpenClaw 只能用接入 API 的方式使用算力吗”这个热词,我想专门说明一下:不是的。OpenClaw 支持通过 Ollama 接入本地推理模型,算力完全由你自己的机器提供,不需要任何外部 API。日常维护中,把 Ollama 当成一个独立服务来管理即可,OpenClaw 和 Ollama 之间的关系就是客户端和服务端。
4.3 安卓端(Termux)资源限制与保活
在 Termux 上跑 OpenClaw 是社区里比较热门的玩法,但手机的资源远不如桌面机器,系统经常会在内存紧张时清理掉后台进程。Termux 上维护 OpenClaw,除了常规的openclaw status/openclaw logs之外,还要加上两个 Termux 特有的命令:
# 阻止 CPU 休眠 termux-wake-lock # 查看电池状态(确认是否在充电) termux-battery-statustermux-wake-lock是保活的关键。如果不执行这个命令,手机一锁屏,系统很快就会把 OpenClaw 进程挂起或者杀掉。另外建议在 Termux 里使用tmux或screen来运行 OpenClaw,这样即使 Termux 界面被关闭,进程也能在后台继续跑。
内存方面,不要在安卓机上加载超过手机内存一半的模型。比如一台 8GB 内存的手机,选择 4GB 左右的量化模型可能刚好,加载 7B 模型就会非常吃力。你可以通过free -h查看内存剩余,如果发现 Swap 占用过高,说明内存已经完全不够用了,这时要考虑换更小的模型,而不是继续调优。
5. 常见问题排查与恢复技巧
这一节是实战经验最集中的部分。我把日常维护中遇到的高频问题整理成一个速查表,每个问题都给出排查命令和解决路径。你会发现排查过程其实就是“看日志 -> 确认状态 -> 针对性处理”三步走。
5.1 服务无法启动的排查思路
症状:执行openclaw start后进程立即退出,status显示failed或exited。
第一步,看启动日志:
openclaw logs --since "5 minutes ago" --level debug这里我会直接加--level debug参数,因为很多启动错误在 INFO 级别不会完整展示。常见的错误有以下几类:
- 端口被占用:日志中会出现
address already in use。排查命令是ss -tlnp | grep 8080,找到占用端口的进程,改 OpenClaw 端口配置或停掉那个进程。 - 配置文件解析失败:日志中会指出具体的 YAML 行号。这时候用
openclaw config validate检查配置格式,会得到一个比较明确的错误提示。 - 数据目录权限不足:日志中可能出现
Permission denied。检查~/.openclaw/目录的所有者和当前用户是否一致,使用chown -R $USER ~/.openclaw修复。
5.2 模型加载失败的常见原因
如果你启动 OpenClaw 成功,但一问话就报模型错误,大概率是 Ollama 侧的模型命名或者服务地址有问题。
排查第一步,确认 Ollama 是否在线:
ollama list curl http://localhost:11434/api/tags如果ollama list能显示模型,但 OpenClaw 仍然报model not found,那就要检查 OpenClaw 配置里写的模型名称是否和ollama list输出的完全一致。这里有一个容易踩的坑:Ollama 拉取模型时可能用了带标签的完整名称(比如llama3:8b),而配置里只写了llama3,虽然很多时候 Ollama 会自动补全,但遇到自定义标签时就会报错。
如果ollama list本身不可用,则要看 Ollama 服务有没有被系统杀掉。处理方式:
systemctl restart ollama # 或者手动启动 ollama serve5.3 网络异常与 API 连接问题
OpenClaw 的部分技能需要访问外部服务,比如更新技能信息或者调用某些在线服务。出现网络异常时,日志里会显示Connection timeout或TLS handshake failed。
排查步骤:
- 先用
curl -I检查外部服务是否可达,确定是不是 OpenClaw 的问题。 - 查看代理环境变量是否影响了服务。OpenClaw 默认会读取
HTTP_PROXY/HTTPS_PROXY,如果你配置了代理,但代理挂了,就会造成所有对外请求失败。可以用unset HTTP_PROXY HTTPS_PROXY后重启 OpenClaw 验证。 - 检查 DNS 解析是否正常,
nslookup或dig都可以。
有一点要特别提醒:很多技能在设计时会定期访问 GitHub 或其他代码托管平台拉取更新。如果间歇性出现超时,不一定是 OpenClaw 的问题,也可能是对方服务被限流。一般过几分钟重试就能恢复。
6. 自动化维护脚本与进阶技巧
当我发现自己每隔几天就要重复执行同一批维护命令时,就觉得应该写个脚本把它们串联起来。OpenClaw 的维护场景非常适合自动化,因为命令本身比较固定,而且没有复杂的交互逻辑。
6.1 一个实用的每日维护脚本
下面这段脚本是我在自己机器上跑的“日常体检”脚本,逻辑很简单:查状态、看关键日志、备份、清理过期日志。每个步骤都有输出,方便人工复核。
#!/usr/bin/env bash set -e BACKUP_DIR=~/openclaw-backups DAY=$(date +%F) # 检查服务状态 echo "==> Checking OpenClaw status" openclaw status > /tmp/openclaw-status.txt || echo "OpenClaw not running!" cat /tmp/openclaw-status.txt # 查看过去10分钟的ERROR日志 echo "==> Recent errors" grep -i "error\|panic" ~/.openclaw/logs/openclaw-$(date +%F).log | tail -20 || true # 备份 echo "==> Backing up" mkdir -p "$BACKUP_DIR" sqlite3 ~/.openclaw/history.db ".backup '$BACKUP_DIR/history-$DAY.db'" tar -czf "$BACKUP_DIR/config-$DAY.tar.gz" -C ~ .openclaw/config.yaml # 清理3天前的日志 echo "==> Cleaning logs" openclaw logs --clean --keep 3 echo "==> Done"把这段脚本保存为openclaw-daily-maintenance.sh,然后给它执行权限:
chmod +x openclaw-daily-maintenance.sh脚本里我特意用了|| true来包住 grep 命令,避免日志里没有错误时脚本因 grep 返回非零码而中断。日常维护脚本的第一原则是“宁可跳过某个步骤,也不要让脚本死在半路上”。
6.2 用 cron 实现定时维护
如果你想把上面的脚本跑起来,最简单的方式是用 cron。在终端输入:
crontab -e然后添加一行:
0 6 * * * /home/yourname/openclaw-daily-maintenance.sh >> /home/yourname/openclaw-daily.log 2>&1这里0 6 * * *表示每天早上 6 点执行。注意脚本里使用了绝对路径引用了备份目录,这是因为 cron 环境变量比交互 shell 少,容易找不到 PATH。保险做法是在脚本开头加上export PATH=/usr/local/bin:/usr/bin:/bin。
如果你用 systemd 而不是 cron,也可以写一个.timer单元,思路类似,但 cron 更简单,适合个人场景。
6.3 维护命令速查表
最后把这一节内容浓缩成一张速查表,方便贴在你自己的笔记里:
| 操作 | 原生进程/通用命令 | Docker 部署命令 |
|---|---|---|
| 查看状态 | openclaw status | docker ps --filter name=openclaw |
| 查看日志 | openclaw logs --tail 50 | docker logs --tail 50 openclaw |
| 停止服务 | openclaw stop | docker compose stop openclaw |
| 启动服务 | openclaw start | docker compose start openclaw |
| 重启服务 | openclaw restart | docker compose restart openclaw |
| 更新版本 | openclaw update | docker compose pull && docker compose up -d |
| 回滚版本 | openclaw update --rollback | 重新 pull 上一个镜像版本 |
| 配置备份 | tar -czf backup.tar.gz -C ~ .openclaw | 备份挂载卷目录 |
| 数据库校验 | sqlite3 history.db "PRAGMA integrity_check;" | docker exec openclaw sqlite3 ... |
| 清理日志 | openclaw logs --clean --keep 3 | 挂载卷外使用 logrotate |
这张表不能覆盖所有场景,但能覆盖 80% 以上的日常操作。真遇到命令对不上的情况,先回到openclaw --help,看看实际版本支持什么子命令。
我个人在实际使用中的一个体会是:维护 OpenClaw 最忌讳的是频繁重装。很多问题看起来像坏了,其实就是日志文件太大、端口冲突、模型名称写错、或者进程卡死。按照这篇文章里的排查顺序走一遍,大部分问题都能在 5 分钟内定位。把这些命令沉淀成自己的维护习惯之后,OpenClaw 完全可以做到“部署一次,长期稳定跑”。
如果你是在 ROS2 Humble 环境里配合 Gazebo 仿真使用 OpenClaw,维护重点会稍微偏一点——除了要关注 OpenClaw 本身,还要注意 ROS2 节点是否正常、ros2 node list里能否看到对应的话题节点。但底层维护命令的思路是完全一致的:先看进程,再看日志,最后动配置。把这一套命令玩熟练了,不管部署在什么环境里,你都不会慌。