乐于分享
好东西不私藏

远程 OpenClaw 运维实录:SSH + tmux + 进程管理

远程 OpenClaw 运维实录:SSH + tmux + 进程管理

两天时间里通过 vs@vs-ops-2 远程操作 Mac Mini M1 的完整运维方法。

环境概况

项目
详情
目标机器
Mac Mini M1 16GB (macmini9,1)
OS
macOS 26.4
主机名
vs-op-2
用户
vs
内网 IP

vs-ops-2

用途
本地 AI Agent 推理服务

已部署的服务

服务
端口
进程
启动方式
OpenClaw Gateway
18789
openclaw-gateway
LaunchAgent
Ollama
11434
ollama serve
brew services
MLX Server
11435
mlx_lm.server
手动临时
llama-server
8080
llama-server
手动临时

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  # 每秒更新

实测内存占用:

组合
总 RSS
剩余
状态
Ollama gemma4:e4b
~4.5G
~11.5G
+ MLX qwen 4B
~7.3G
~8.7G
+ Ollama qwen 9B
~14G
~2G
⚠️
+ llama-server 9B
~15G+
<1G
❌ 可能 OOM

批量命令执行

不需要每次都 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"

关键教训

  1. 不在 SSH 里跑长时间交互命令 — 断了就丢上下文
  2. tmux 是第一层保护 — 模型拉取、TUI 测试统统进 tmux
  3. openclaw gateway restart不可靠 — 永远 launchctl + kill + 验证三步
  4. 16G 跑 9B 模型是踩在线上 — 任何额外服务都可能触发 swap
  5. 内网 IP 可能变 — 如果连不上,先 ping 再 check IP