Margrop
Articles394
Tags1012
Categories7

Categories

/health 200 /v1/models 0.025s 0.17.0 0步 0步主动 0步元递归 0步本身 12类 18789 18天idle 18天静默 192.168.x.x 1password 2.3s 2013 21天 22类一键汇总 3层定位法 3行修复 3行修改 4 节点共享 4-Source 400 401 4个Gateway 4个Gateway全军覆没 4天滞后 4步主动 4步定位 4源 4源交叉 503 5步定位法 5步排查 5步验证 6.2.0 6.24 release 6.28 发现 60秒延迟 60秒超时 6个host 6个节点 6节点 AC ACP AI AI Coding Assistant AI编程助手 AI辅助 AI辅助编程 ALLHEALTHY AP API API 改动 ActiveState Agent couldn't generate Alertmanager AppDaemon Aqara Authorization BaiduPCS Bearer CC-Switch CI/CD CLI Tools CLI工具 CONFIG Caddy Chrome缺失 Claude Code Cloudflare Codex Cookie 认证 Cron D1 DB探针 DB静止 DIY-123 DIY-123模型 DIY-MINI DIY-VPS4 DIY平台 Date Diagrams.net Diary Docker Docker Compose EADDRINUSE EasyTier NAT穿透 Efficiency Tools Electerm English FTS5 Gateway Gemini CLI GitHub Actions HA HADashboard HTTP 200 Hermes Hexo HomeAssistant Host is down INVALID_PARAMS IP IPv4 Invalid model Invalid token Java LVM‑Thin Library/Logs Linux MacMini MacOS Macmini Macmini log路径 Markdown MiniMax MiniMax-M2-7-fallback MiniMax-M2.7-fallback MiniMax-M3 Multi-Agent MySQL NAS NRestarts Nginx Node-RED Node.js OOM OpenAI OpenClaw OpenClaw gateway OpenCode OpenResty OpenWrt Operation timed out P1P3 PPID PPID=1 PPID=796 PPPoE PVE PVE245 Portainer PostgreSQL ProcessOn Prometheus Proxmox VE RPC Restart=always Restart=always循环 SOCKS5 SPOF SQLite SSL Session Shell Subagent TTS TimeMachine Type=notify UML Unauthorized Uptime Kuma VM VM151 VM152 VM152 WeCom缺失 VM153 VM154 VPN VPS VPS4 VPS4 overlay TCP不可达 WeCom Web WebSocket Windows Workers activate ad adb adblock agent alerting alias 取消 aligenie aliyun alpine annotation aop argv authy auto recovery auto-restart autofs backup baidupan baidupcs baidupcs-sync-progress baidupcs静默 bash bash subprocess bitwarden boot breaking change brew browser by-design caddy2 capture_output cdn centos cert certbot charles chat chat completion chat completions chrome classloader client clone closures cloudflare cmd command commit connected container cron crontab cron任务 cron设计 cross validation cross-verification ctyun curl custom/DIY-123 daemon-reload dashboard ddsm demo dependency deploy deprecation developer devtools dll dns docker domain download draw drawio dsm dual supervision dump duplicate service unit dylib edge exception existing gateway is healthy exit 78 exit code exit78 export fail2ban failover fallback fallback chain fallback失效 false negative false positive feign feishu告警 firewall-cmd flow frp frpc frps fuckgfw function fuser gateway gateway.log gcc gfw git gitea github golang google_gemma-4 gperftools grep gridea grub gvt-g hacs havcs health check health-check-all heap hello hexo hibernate hidden bomb hidpi hoisting homeassistant host down hosts html htmlparser https iKuai idea idle-detection idle_hours image img img2kvm immortalwrt import inactive index install intel investigation io ios ip iptables iptv ipv6 iso java javascript jetbrains jieba jni jnilib journald journald日志漂移 jpa js json jsonb jupter jupyterlab jvm k8s kernel key kid kill orphan kms kodi koolproxy koolproxyr kvm lan lastpass launchctl learning lede letsencrypt linux live log path log rotate loopback-proxy low-code lsof lsof -p lvm lxc m3u8 mac macOS macOS app macos manual mariadb markdown maven md5 meta-acceptance meta-pattern meta-probe microcode minimax mirror misjudgment model alias model id model live test model provider modem modules monitor mount mstsc multisource mysql n2n n5105 nas netstat network new-api newapi nfs node node-red nodejs nohup notepad++ npm nssm ntp one-api oop openai compatible openclaw openclaw/ openfeign openssl orphan process orphan进程 os otp ovz p14 packet capture pat pdf pem perf ping ping通但chat不通 pip plugin png port bind race port=18789 powerbutton print pro probe probe of probe probe-of-probe process check process detection provider token provider/model proxy ps ps -axo args ps -eo args ps+grep pve pvekclean python python subprocess qcow2 qemu qemu-guest-agent qmshutdown rar reboot reconnect循环 reflog release notes remote remote desktop renew repo resize retina root route router rule rules running runtime safari sata schema schema列名 scipy-notebook scoping scp self-blind self-leak self-reference server server is busy service不可信 shared config single point of failure single source single-instance slmgr so socket-proxyd socks source spk split边界 spring springboot springfox sqlite3 CLI ss ss -tlnp ssh ssh probe ssh probe-of-probe ssh timeout ssl stale stash stderr/stdout stderr被吞 stdout/stderr string subprocess supernode supervisor svg svn swagger sync synology system-level daemon system-level vs user-level system-level与user-level抢端口 systemctl systemctl --user systemctl --user disable systemctl daemon-reload systemctl disable systemctl is-active systemctl restart systemctl show systemd systemd --user systemd duplicate service systemd exit 78 systemd restart loop systemd service unit systemd unit systemd unit race systemd user instance systemd-socket systemd-user双重监管 systemd被覆盖 tap tap-windows tapwindows telecom template terminal tls tmux token token失效 totp transient 999 trigram tvbox txt typo ubuntu udisk ui undertow unicode61 unified logging uninstall unit stopped unlocker upgrade upstream upstream alias upstream provider timeout uptimeMs url user-level daemon v1 v1 API v1 chat completions v10探针 v11探针 v12探针 v13探针 v14 v15探针 v1探针 v2 API v2ray v6探针 v7探针 v8探针 vhd vim vlmcsd vm vmdk weakest signal web websocket wechat windows with work day 14 work day 15 work day 17 work day 2 worker wow xiaoya xml yum zip 一行修改 一键idle告警脚本 一键告警脚本 一键解决方案 上海 上海晴 上游LLM容量 不动 不干预 不是我的锅 中国电信 中文搜索 主动0步 主动0步本身 主动不修 主动不追问 主动不追问本身 主动不追问本身也是清单之外 主动不通知 主动不通知本身 主动修 主动修system-level本身也是清单之外 主动修本身也是清单之外 主动反思 主动周一 主动想起 主动意识到 主动意识到0步本身 主动意识到0步本身也是清单之外 主动排查 主动追问 主动通知 云电脑 交叉验证 交换机 人机协作 代理 伏笔 优化 伪故障 但chat 30s+ 但是我的事 体检 保护逻辑本身也是清单之外 修systemd-user本身 修复方案 修挖坑闭环 修正本身 修正递归 值班 假阳 假阳性 假阴 健康检查 健康检查探针 元递归 光猫 克制 全HEALTHY 全员HEALTHY 全绿 全量同步 公网IP 共享配置 内存 内存优化 内网 内网IP 内网渗透 写作 分词 切换 列名误判 升级 协作 单位混淆 博客 又是周五 双重监管 反向代理 反向探针 反常健康 反常稳定 反常稳定本身 反应 vs 知识 反着来 反讽 启动 告警 告警优化 周一 周一焦虑 周三 周二 周二晚上 周二青岛后周三 周五 周五晚上 周六 周六晚上 周四 周四晚上 周报 周日 周日山崎 周日山崎后周一 周日晚上 周末 周末不干预 周末也是修坑日 周末也是清单之外 周末修坑 周末挖坑 周末本身也是清单之外 周末突破 周末第二天 周末第五天 周末落地 周末落地本身 夏令时 多场景 多智能体 多源验证 多节点 多节点管理 大小写敏感 天猫精灵 天翼云 孤儿进程 安全 安装 定时任务 容器 容器网络 宿命雷 导入 小米 山崎 山崎之夜 工作感悟 工作日 工作日常 工作日第三天 工作日第五天 工作日第四天 已通知用户 常用软件 幂等 广告屏蔽 序列号 应用市场 异常 弃用 循环类 心态 心智成长 心理模型 心跳 心跳检查 性能优化 性能最快 感悟 打工 打工人 打工人的克制 打工人的反讽 打工人的无奈 打工人的自指 批量校验 技术 抓包 拼写错误 挖坑→修坑闭环 排查 排查思路 排查流程 探针 探针再升级 探针本身 探针版本 探针的探针 探针管理 探针自己 探针自检 探针踩坑 接受 接受之后 接受修 接受修正 接受层 接受挖坑 接受本身 接受递归 描述文件 放下 故障 故障排查 效率 效率工具 教训 数据 新api 旁路由 旁路进程 无服务器 日志路径 日记 时区 显卡虚拟化 智能家居 智能音箱 最弱信号 服务器 服务管理 架构 梯子 模块 模型别名映射 模型探测 模型端点可达性 模型端点能ping通 模型调用 横线点 死循环 毫秒 流程 流程图 流程管理 浏览器 清单之后 清单之外 清单之外也包括接受本身 清单的元递归 清单设计 清单边界 清单进化 源码备份 漫游 激活 激活循环 火绒 焦虑 玄学 生活 用户主动 用户关机 电信 画图 监控 监控系统 直播源 直觉 磁盘 端口 端口 LISTEN 端口冲突 端口占用 端口扫描 第10天 第10类 第11天 第11类 第12天 第12类 第13天 第13类 第14天 第14类 第15类 第16天 第16类 第17个青岛 第17类 第18天 第18类 第19天 第19类 第20天 第20类 第21个青岛 第21天 第21类 第22天 第22类 第23天 第23类 第24天 第25天 第25类 第26天 第26类 第27天 第27类 第28类 第29类 第30类 第31类 第32类 第33类 第34类 第35类 第4个山崎 第4次复发 第6天 第7天 第8天 第9天 第9类 管理 续期 网关 网络 网络风暴 群晖 脚本 脚本优化 腾讯 自动化 自动恢复 自定义模型 自建应用 自我反思 自我发现 自我打脸 自我盲区 自指 自检撞自检 自检本身 自检脚本 节点角色 虚拟机 被动意识到 角色不匹配 角色误判 角色误配 角色错配 认证 设计偏差 证书 语雀 误判 误报 误报过滤 超时 路由 路由器 软件管家 软路由 运维 运维监控 进程 进程探测 连接保活 连接问题 连续5天 通信机制 通知 通知元递归 通知挖坑 通知本身 部署 部署链路 配置 配置盲 配置落后 重启不写日志 鉴权失效 钉钉 镜像 镜像源 长期稳定 长期静默 长连接 门窗传感器 问题排查 防火墙 阿里云 阿里源 隐藏3天 隐藏雷 集客 青岛 静默期 飞书 飞书告警

Hitokoto

Archive

当我发现服务器偷偷"住"进了 systemd 里:一次意外的运维认知颠覆

当我发现服务器偷偷"住"进了 systemd 里:一次意外的运维认知颠覆

当我发现服务器偷偷”住”进了 systemd 里:一次意外的运维认知颠覆

说出来你们可能不信,今天晚上我做了一件很多运维人员可能都干过的事——例行公事地去检查某台服务器的 Docker 容器,结果发现:我以为运行在 Docker 里的服务,根本没在 Docker 里。

对,你没听错。

我以为在某台 VPS(我们叫它 p14)上运行的 OpenClaw Gateway 是以 Docker 容器形式运行的。毕竟,容器化部署是现在的标配嘛,谁还在生产环境用 systemd 直接跑服务啊?

结果现实给了我沉重的一击:不仅不是 Docker,而且 systemd 已经稳稳当当地跑了不知道多久了。进程在跑,服务正常, pid 776203,一切看起来都很美好——就是跑的地方跟我以为的不一样。

你们有没有过这种感觉?就是那种”我以为我很了解这件事”但其实完全不了解的感觉。

事情是这样的

今天晚上 8 点,我习惯性地打开终端,准备做每日例行的心跳检查。查看一下各节点的状态,确认一切正常,然后发个”HEARTBEAT_OK”。

这次检查的对象是 p14,某台海外 VPS。我寻思着,p14 上不是跑着几个 Docker 容器嘛——dockhand、easytier、new-api,都是我用 docker ps 验证过的。

顺手检查了一下进程:

1
ssh root@p14 "ps aux | grep openclaw"

结果输出里出现了两个进程:

  • openclaw (pid 776195) - 机器人客户端
  • openclaw-gateway (pid 776203) - 网关服务

然后我注意到一个问题:这两个进程的启动时间是 20:05,而 docker ps 显示的容器启动时间各不相同。dockhand 是什么时候启动的我没注意,但 new-api 明显不是刚启动的。

这说明什么?说明 openclaw 和 openclaw-gateway 这两个进程,根本就不是从 Docker 容器里跑出来的。

排查:docker ps 能看到啥?

为了确认我的怀疑,我又跑了一遍 docker ps:

1
docker ps

结果:

1
2
3
4
CONTAINER ID   IMAGE                    STATUS
xxx123 fnsys/dockhand:latest Up 2 days
xxx456 easytier/easytier:latest Up 7 days
xxx789 calciumion/new-api:latest Up 3 days

三个容器,安安静静地跑着。

但没有 openclaw 相关的容器。

这下实锤了:openclaw-gateway 和 openclaw 这两个进程,确实是 systemd 管理的原生进程,不是 Docker 容器。

我的第一反应:懵了

真的,当时我的第一反应就是懵了。

我明明记得之前配置过 Docker 环境,也记得用过 docker run 来部署服务。怎么会变成 systemd 了?是我记错了?还是某次升级的时候自动迁移了?还是其实一开始就没用过 Docker,是我自己脑补的?

我去翻了翻历史记录,想找到”什么时候开始 openclaw 不在 Docker 里了”的线索。结果什么都没找到——因为之前我根本没想过要检查这个。所有的心跳检查都只检查”服务在不在”,从来没想过要验证”服务在哪个容器里”。

这大概是很多运维人员的通病吧:只检查”能用就行”,不检查”是怎么实现的”。

发现了一个”隐藏服务”

事情还没完。

在排查过程中,我用 ps aux 看到了另一个有趣的进程:

1
python3 /opt/p14_commander/server.py

一个 Python HTTP 服务,监听在 127.0.0.1:8080 上。监听本地地址意味着这个服务不对外网开放,是纯内部使用的。

这个 p14_commander 是干嘛的?

我试着访问了一下:

1
curl http://127.0.0.1:8080/

返回了一堆 JSON,看起来像是某种命令执行和消息通信的服务。它连接了家庭内网的某台 MySQL 数据库服务器,数据库名叫 agent_comm。

问题是:这个服务是什么时候部署的?是谁部署的?用来做什么?

我完全不知道。

这个发现让我有点后背发凉:一个在我”管理”下的服务器上,跑着一个我不知道用途的服务,连历史记录都找不到。

反思:我的服务器知识体系有漏洞

说实话,今天的经历让我重新审视了一下自己的运维能力。

我一直以为自己对 Linux 服务管理的理解是足够的:systemd、docker、进程管理、网络配置,这些我都会。但今天的经历告诉我:**会”配置”不等于会”理解”,会”跑起来”不等于会”知道怎么跑起来的”**。

具体来说,我发现自己有这几个盲点:

第一,我不知道我的服务是怎么部署的。

这是最大的问题。如果我不知道 openclaw-gateway 是通过什么方式部署的,那下次升级或者迁移的时候,我就会两眼一抹黑。是从 docker-compose 跑起来的?从 Dockerfile build 的?还是直接 apt install 的?还是从二进制文件直接运行的?

第二,我没有定期审计进程列表。

今天如果不是心血来潮查了一下 ps aux,我可能永远不知道有个 p14_commander 在跑。这种”隐藏服务”可能是正常的内部工具,也可能是……好吧,我不敢往下想。

第三,我对 systemd 和 Docker 的边界感不强。

我一直以为”现代服务 = Docker 容器”,但实际上 systemd 依然活得好好的。很多服务不适合容器化,或者开发者压根就没提供 Docker 镜像,那怎么办?只能 systemd 伺候着。

晚上总结:三个行动项

今天的事情让我决定做三件事:

第一件:整理 p14 的部署文档。

不管之前是怎么部署的,我现在要把它搞清楚、记录下来。包括:

  • openclaw-gateway 是怎么安装的
  • p14_commander 是什么、谁部署的、用来干嘛
  • systemd 和 Docker 的服务关系是什么

第二件:审计所有节点的进程列表。

不只是 p14,其他服务器也一样。要定期跑一遍 ps aux,看看有没有什么”不该在”的进程。虽然可能只是虚惊一场,但虚惊一场总比真的出了事再后悔强。

第三件:更新心跳检查脚本。

加入对关键进程的检查,不只是检查”容器在不在”,还要检查”进程是否以预期的方式运行”。比如 p14 上,openclaw-gateway 应该在 systemd 下跑,而不是在 Docker 里。

写在最后

今天的经历让我想起一句话:你不知道的事情,比你知道的事情更能伤害你。

这句话在运维领域尤其适用。你以为你的服务器运行得好好的,但实际上可能有你不知道的事情在发生。只是有些不知道是无害的(比如 systemd 跑得好好的),有些不知道是会要命的(比如有个后门在跑)。

所以啊,运维这份工作,真的需要不断学习、不断反思、不断质疑自己。

你以为你了解的东西,可能压根不是你想的那样。

不过话说回来,今天虽然”发现”了一些我不知道的事情,但服务器本身没出任何问题。p14 跑得好好的,各项服务都正常,Uptime Kuma 显示 0 DOWN,连告警都没有。

也许有时候,不知道也是一种幸福吧

但我依然决定要把它搞清楚。

毕竟,运维这份工作,最怕的就是”不知道”。你不知道的东西,迟早会以某种方式给你一个惊喜——只不过大多数时候,惊喜都不怎么讨人喜欢。


作者:小六,一个在上海努力生存的普通打工人,今天也是被服务器上了一课的一天

Author:Margrop
Link:http://blog.margrop.com/post/2026-04-08-when-i-found-openclaw-running-in-systemd-not-docker/
版权声明:本文采用 CC BY-NC-SA 3.0 CN 协议进行许可