站点跑久了,最怕的不是宕机,而是那种半死不活的状态:证书还有三天过期、磁盘悄悄涨到 92%、某个页面 500 了但首页还正常。这些事单独看都不致命,凑在一起就难受。我试过一堆监控服务,最后发现真正每天会看的,只有早上打开终端敲的那条命令。于是干脆把巡检做成一个脚本,一条命令跑完,结果直接打印在屏幕上。
先想清楚查什么
动手之前先列清单,别一上来就写代码。我关心的其实就五件事:站点能不能正常响应、响应有多快、TLS 证书还剩几天、服务器磁盘和内存还剩多少、最近有没有新的错误日志。前两项对外,后三项对内。
清单列完你会发现,每一项都有现成的命令行工具能干:curl 管响应,openssl 管证书,df 和 free 管资源,grep 管日志。脚本要做的不是实现功能,而是把它们串起来、统一格式、该报警的报警。这个认知很重要,它决定了脚本不会写成一个臃肿的框架。
用 curl 把外部状态摸一遍
外部检查我用一个函数封装,传域名进去,返回状态码和耗时。关键是别只看 HTTP 200,要加上超时和重试,否则网络抖动会让你误判。我用的参数大意是:静默模式、跟随跳转、最多等十秒、失败重试两次,最后只输出状态码和总耗时。
有个坑我踩过:默认 curl 不把 4xx 和 5xx 当失败,退出码还是 0。所以判断不能靠退出码,得解析输出的状态码字段。另外首页正常不代表全站正常,我额外挑了两个关键路径一起查,比如文章页和搜索接口,这三个都过才算外部健康。
证书和资源用现成工具
证书检查不需要连服务器,本地用 openssl 对着域名取一下就行,把返回的过期时间解析出来,和当前时间做差,算出剩余天数。我设的阈值是 14 天,低于这个数就在输出里标红提醒。这个数字没有绝对标准,取决于你用不用自动续期;我用的是自动续期,留两周足够排查续期失败的情况。
服务器资源走 SSH 执行一条组合命令,把磁盘使用率、内存占用、负载三个数一次拿回来。这里有个细节:df 的输出列对齐依赖空格,直接 awk 取字段在有的系统上会错位,稳妥的做法是明确指定输出格式,只取需要的列。拿回来的数字和阈值比较,超过就标记。
日志只抓增量
日志检查最容易被做成噪音源。我的做法是记录上次巡检的时间戳,每次只 grep 这个时间点之后的 ERROR 行,数量超过阈值才提示,并且只打印前几条样本。这样既不会漏掉突发错误,也不会每天刷屏。
时间戳存在一个临时文件里,脚本跑完就更新。这个思路和之前把日志变早报那篇是一脉相承的:日志的价值在于变化,不在于全量。全量日志应该留在服务器上给需要的时候查,巡检只负责告诉你「今天和昨天不一样」。
输出要一眼能看完
最后所有结果汇总成一张表,每行一项,通过打勾、警告打叹号、失败打叉,末尾给一行总结。整个输出控制在二十行以内,扫一眼就知道今天要不要动手。脚本退出码也做了区分:全部正常返回 0,有警告返回 1,有失败返回 2,这样以后想接进 cron 发邮件或者推到手机上,不用改脚本本身。
现在每天早上泡完咖啡,敲一下这个命令,几秒钟看完。它没有仪表盘好看,但它在我会看的地方。工具的价值不在于功能多全,而在于它恰好出现在你每天必经的那条路径上。下一步我想给它加个参数,支持只查某一项,排查问题时能省几秒。


