远程 OpenClaw 运维实录:SSH + tmux + 进程管理
两天时间里通过
vs@vs-ops-2远程操作 Mac Mini M1 的完整运维方法。
环境概况
|
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
vs-ops-2 |
|
|
|
已部署的服务
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
SSH 运维基础
# 连接ssh vs@vs-ops-2# 查看系统资源top -l 1 | head -10vm_stat# 查看进程ps aux | grep -E "ollama|openclaw|mlx"# 查看端口lsof -i :18789lsof -i :11434lsof -i :11435
模型下载监控
Ollama pull 一个 6.6GB 的模型需要 10-15 分钟。如何监控进度?
# 方法 1:看 Ollama 日志tail -f ~/.ollama/logs/server.log# 进度行:pulling 4c27e0f5b5ad: 21% [====>...]# 方法 2:看下载速度# 进度的百分比变化 / 时间间隔 = 速度# 实测:6-20 MB/s,波动大# 方法 3:用 pv 监控ollama pull qwen3.5:9b 2>&1 | pv -l
拉取速度历史数据
模型:qwen3.5:9b (6.6 GB)2%: ~14-20 MB/s → 估约 5-6 分钟12%: ~7-10 MB/s → 估约 10-15 分钟21%: ~6-8 MB/s → 估约 10-14 分钟最终:~12 分钟完成
速度波动大是因为 Ollama registry 的 CDN 和网络状况变化。
tmux 远程会话管理
SSH 会断——tmux 让长时间任务不中断。
# 创建新 tmux sessiontmux new -s openclaw-test# 分离(不中断任务)Ctrl+B, d# 重新连接tmux attach -t openclaw-test# 查看所有 sessiontmux ls# 在 tmux 里跑长时间任务tmux new -s ollama-pull "ollama pull qwen3.5:9b 2>&1 | tee /tmp/pull.log"
我们的 tmux 使用场景
# 场景 1:拉取大模型(不掉线)tmux new -s pull-9b "ollama pull qwen3.5:9b"# 场景 2:OpenClaw TUI 测试(保持会话)tmux new -s tui-testopenclaw tui --session test-qwen# 场景 3:MLX server(长期运行)tmux new -s mlx-servermlx_lm.server --model mlx-community/Qwen3.5-4B-MLX-4bit \ --host 127.0.0.1 --port 11435
进程管理技巧
清理僵尸进程
# 查看所有 openclaw 进程ps aux | grep openclaw# 杀所有 openclaw gatewaypkill -f "openclaw.*gateway"# 确认清理干净ps aux | grep openclaw | grep -v grep | wc -l# 应输出 0
端口冲突处理
# 谁占了端口?lsof -ti:18789# 杀掉kill -9 $(lsof -ti:18789)# 验证端口释放lsof -i :18789# 应无输出
LaunchAgent 管理
# 查看launchctl list | grep openclaw# 停止launchctl bootout gui/501/ai.openclaw.gateway# 启动launchctl bootstrap gui/501/ \ ~/Library/LaunchAgents/ai.openclaw.gateway.plist# 注意:gui/501 是当前用户的 GUI domain# id -u 查看你的 UID,替换 501
内存压力监控
16G 跑三个模型服务是个挑战:
# 查看内存使用ps aux | awk '{sum+=$6} END {print sum/1024 "MB total RSS"}'# 按进程看ps aux --sort=-%mem | head -10# 压力测试vm_stat 1 # 每秒更新
实测内存占用:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
批量命令执行
不需要每次都 SSH 进去手动敲:
# 远程执行单条命令ssh vs@vs-ops-2"openclaw gateway status"# 批量检查ssh vs@vs-ops-2" echo '=== Gateway ===' openclaw gateway status echo '=== Ollama ===' curl -s http://127.0.0.1:11434/api/tags | jq '.models[].name' echo '=== Ports ===' lsof -i :18789,:11434,:11435"
自动化运维脚本
#!/bin/bash# check-services.sh - 快速健康检查check_port() {if lsof -i:$1 &>/dev/null; thenecho"✅ Port $1: listening"elseecho"❌ Port $1: not listening"fi}echo"=== Health Check $(date) ==="check_port 18789 # Gatewaycheck_port 11434 # Ollamacheck_port 11435 # MLXecho""echo"=== Memory ==="ps aux | awk '{sum+=$6} END {printf "Total RSS: %.1f GB\n", sum/1048576}'echo""echo"=== Models ==="ollama list 2>/dev/null || echo"Ollama not reachable"
关键教训
-
不在 SSH 里跑长时间交互命令 — 断了就丢上下文 -
tmux 是第一层保护 — 模型拉取、TUI 测试统统进 tmux -
openclaw gateway restart不可靠 — 永远 launchctl + kill + 验证三步 -
16G 跑 9B 模型是踩在线上 — 任何额外服务都可能触发 swap -
内网 IP 可能变 — 如果连不上,先 ping 再 check IP
夜雨聆风