凌晨三点,告警刚消停,写点上个月的事。
九月,记不清哪天,反正是个周三,不对,周四凌晨,一点多,一台从库的 inode 报警了。df -i 一看基本满了,这种一般是有目录在攒小文件,得先登上去找是哪个目录。手上那批机器三十来台,一台台登太慢,就想起我自己那个 check_inode.sh。
那个脚本,就是循环一批机器,ssh 进去跑 df -i,把超过百分之八十的打出来,图省事写的。之前一直是 for i in $(cat hosts.txt),能用,毛病就是中间哪台连不上会卡在那不动。那天我想着顺手改成 while read,文档里都那么写,while read line; do ssh ... ; done < hosts.txt。
改完一跑,卡住了。
不是报错,就是卡,一行不动,日志也不出。我盯着屏幕看了能有四五分钟,以为是网络慢,抽了根烟回来还是那样。Ctrl+C 重跑,还是那样。当时就有点火,凌晨一点二十,报警那台机器还没登进去看呢,我在这跟自己写的脚本较劲。
后来把 set -x 打开,看它读到哪,发现个事:第一台跑完,就没了,循环只迭代了一次。while read 只读了一行。
这个坑文档里写过,我看过,忘了。ssh 默认会去读 stdin,把 hosts.txt 里的内容全吃走了,后面 while read 没得读。加个 -n,或者 ssh </dev/null,就完了。就这么两三个字符的事。
改完跑通了,那台从库也登进去了,是个第三方 agent 的目录,攒了几十万个空文件。一个个删肯定不行,AI 给我写了个 find 分批删的,加 -delete,我老是把 -delete 和 -exec rm {} ; 记混,干脆让它写。清到三点多,df -i 降下来了,告警消。inode 这种告警不像磁盘,磁盘一满整个都乱,inode 满有时候系统还能跑,就更容易被拖,白天不看,晚上炸。
说到这个,那台机器白班交接的时候我提过一句,白班的兄弟说他们下午看过,指标还行,其实一直在涨,只是没到线。白班的世界看不到凌晨一点四十五是什么样,不是他们的错,就是看不到。
后来我让 AI 把 check_inode.sh 整个过了一遍,加注释,加了 ConnectTimeout,加了每一台机器打完一行日志。之前这些我都不加,能跑就行,没出事就懒得管,人的惰性,我的惰性。现在跑起来一行行往下滚,看着踏实,比原来那个静悄悄卡死强。
我那个工具箱里好几个脚本都是这毛病,能跑,就一直在那跑,等到哪天卡住了才回头补。前一阵,不对,应该是九月底那几天,我把里面三个都翻了一遍,超时和日志补齐了。工具可以旧,不能哑。
四点还有个巡检,先这样,困了。