64 个 systemd 服务挤在一台机器上,我用一行命令把它们的体检排成了班

我打开 systemctl
只是想数一数
今天这台机器上
到底有多少个服务还在跑。
结果出来那一行
64。
六十四。
数字挺吓人
但更吓人的
是我发现
自己居然叫不全这 64 个名字。

都是这些年一点点攒的
一开始就是书桌旁那台小电脑
跑个 API 网关
跑个前端代理
跑个自动备份脚本。
后来事情越加越多
写作站同步
签证站同步
一两个公司接口
再加几个定时任务
每一件都说「就是挂个守护就行」
上线那天我也点了「好了」。
几个月下来
就成现在这个样子。
光看 systemctl
64 个 active running
齐刷刷一片绿。
可是绿的
不等于在干活。
有些服务确实在打日志
写一行一行时间戳
有些服务的日志
一翻
上一条是三天前。
三天前的服务
systemd 不管它
还给它亮着绿灯
你去看监控页
全绿
心情也好。
真出问题那天
用户先打过来
你才反应过来
原来这个服务
睡了 72 个小时。
我先开了 ps aux
流水一样往下滑
活进程数 392。
API 的、看门狗的、数据库的、定时任务的
也有一点多余的奇怪名字。
我开始把它们分成三类。
第一类
有近一分钟新鲜日志
有响应
这是真的在干活的。
第二类
进程在、日志在
但日志只有一行空行
隔天再去看
又一行空行。
第三类
进程在
主动调用什么都返回成功
可一查它的实际日志
全是「待连接」「等待任务」。
光 systemctl 看不出来这三类的差别
只能分出
在 vs 不在。
我干的事
是把每一类再标了一个自己看得懂的标签。
第一类
继续让它戴着 systemd 的绿章
第二类
我抓它的最后一行日志进去核对
是不是真的在写
字段在不在
时间戳对不对
差一个就把它从绿变黄。
第三类最危险
进程还活着
systemctl 一行 active running
但活的只是一具壳
我开始给它加一条心跳探针。
心跳不复杂
就一句
curl 一下它本地的健康端点
拿到 200 就记一条时间戳。
这条命令
不靠 systemd
不靠监控页
只靠它自己写一行。

我把这套脚本
跑成一条 systemd timer
每分钟起来一次
挨个去敲每个服务的健康门。
谁回 200
记一行
谁不回
记一行「无响应」
并且告诉 systemd
这个服务可以降级。
有一次我自己装的告警脚本
装上之后连续三天
每分钟回来都是 200
我心里美得不行
以为稳了
直到我去翻它的回调日志
三天来只有第一天的
「hook 收到」「队列空」
后面两天
全是一行「post without body」
它的 200 是真的
它没有工作也是真的。
这件事让我开始疑心
每一个看上去太健康的服务。
写完这一晚
我又跑了一下 systemctl。
数字还是 64
绿色还在。
可是这次
绿色底下
我自己心里有一张表
谁在动手
谁在装睡
谁只是站着没走。

看监控图表最怕的是
虚假的平静。
一个服务一个月没出过事
不是因为它稳
是因为它没人查。
绿色的 systemctl
是机器给你一张最省力的笑脸。
你没戳过它
它就一直笑。
我开始每天早上做一件事
把昨晚的「无响应」分桶
落地到当天的修补清单里
哪个服务几点挂了
几秒恢复
要不要拆掉它。
这条清单
比看监控页管用多了。
也给同事每周看一次
谁的服务出问题最多
谁的接口改动最大
谁最容易在系统里长期躺平。
不是批评
是不让躺平的人永远躺平。
落点我想留给你。
如果你也守着很多服务
照这么来。
第一
systemctl 看上去全绿
不代表全部真活。
补一层你自己的心跳探针
脚本最笨
管用最稳。
第二
按近一分钟日志分三类
真干活
装睡
站岗没下手。
三类给三种颜色
别只看到绿色就放心。
第三
每天早上拉一遍「无响应」清单
不是看监控
是改代码。
第四
每个看上去太健康的服务
值得多看它一眼
它可能在两个月里
只发了 200
没干别的。
任何时候做任何事情
一定全心全意
也一定先盯自己写的进程
再谈别的。
我记得很清楚这件事发生那天
是凌晨三点
我刚盯完一整晚的爬虫
跑去刷了一下 systemctl
还是 64 行绿
可是心里已经不踏实。
做运维这一行
最怕的不是红
是绿
绿的太齐
绿的不像话
你在凌晨三点
忽然就明白
哪一行是真的 200
哪一行是真的空在那
等一个出问题的人去戳它。