那个抓现场的脚本,上个月写的,不对,九月底——反正国庆前那阵子——今天凌晨又用上了。今天这个不是重点,重点是当时写它的过程,我到现在还有点没缓过来。
事情是这样的。有台机器,10.32 那段的,负载每天夜里两点多准时往上飙,飙到二十几,白天好好的。白班查了两天抓不着现场,人不可能守到两点。交接给我的时候就一句"你看看"。我看了一眼监控,确实,两点十三开始,两点四十左右自己下来。
我本来想自己写,老办法,nohup 挂个 while 循环,一分钟记一次 top。那天懒得写,就把需求丢给 AI 了:三十秒抓一次,load、进程 CPU 前二十、连接数、D 状态进程都存下来,按时间戳分文件。
第一版跑起来就栽了。它用了 pidstat,我这儿没装 sysstat,直接 command not found,脚本第一行就退出去了。这个怪我没跟它说环境,我是觉得这不用说吧,写运维脚本总得知道有些机器是裸的。改了一版,改成直接读 /proc,通了。
说到这个,我原本以为这就完事了,凑合能用呗。结果我打开它写的那个目录看了一眼,愣住。它给我按日期分了一层目录、按小时又分了一层,每个文件开头写了一段注释,说这文件抓的是什么、哪个字段什么意思、什么情况下会为空。还写了个 README。
不是,我写脚本写了五年,从来没写过 README。我写的脚本半年后自己都看不懂,全靠一个 # 清理 两个字硬猜。老爷子那个 U 盘里的脚本注释比代码多,我前两天还跟人说要把注释都保留,结果轮到我自己写,一个字都不写。
它干得比我好。这句我认,我当时坐那儿确实有点不是滋味,就是你干了五年练出来的手感,人家一秒钟,还比你细致。
但也别把它吹过头。它那段判断 D 状态进程的逻辑是错的,它把 D 和 Z 一起过滤了,僵尸进程跟不可中断睡眠根本不是一回事,我给它改回来了。它还不认,跟我解释半天说这俩都是"非正常状态",我说是,一个等 IO 一个等着被回收,你混一块我这脚本还看什么。后来它改了。
这脚本昨天夜里真逮着了。是个定时任务跟备份撞车,两点十分开始,跑了二十多分钟。就这么个事,白班查了两天。
对了还有个小插曲。它给我加了个自动清理,快照超过七天自己删。这个我压根没要求。但挺好,不然照这节奏跑俩月能把 /home/ops 撑满,那分区就 20G,这种事我以前干过。
先这样,四点还有个巡检,我眯二十分钟。