跳到主要内容

AI重写了我那个祖传清日志脚本

夜班大鹏
夜班大鹏

· 阅读约 3 分钟

凌晨一点四十,又被磁盘告警吵醒——不是我困不困的问题,是那台老机器又满了。点开一看,不出意外,又是那个脚本跑挂了。

说到这个脚本,得从三年前说起。那时候我刚转到夜班没多久,前任运维交接的时候给了我一堆脚本,其中有个叫 cleanlog.sh,作用是清历史日志。当时他说"这脚本稳得很,用了两年没出过事",我也就真信了。后来才发现,他说的"没出过事",是因为他一直没看过它到底怎么干活的。

那个脚本有多烂呢。用 sed 拼接字符串做路径,变量名全是 abc,没有一行注释。最重要的一点,它清日志的方式是 find /var/log -name "*.log" -mtime +3 -exec rm {} \;,直接删,不管哪个服务正在往里面写。没出事纯粹是运气好——那台机器日志量不大,服务也少,删完了最多就是进程继续往已经不存在的文件里写,页面挂了再重启一下而已。

前天晚上,不对,昨天凌晨,它出事的时候已经是凌晨两点多了。日志目录满了以后,别的进程写不进日志,服务崩了一片。我过去一看,那个脚本正卡在 sed 那步——它自己日志都写不了,循环卡死了,把 CPU 吃满。

当时我就想,该让 AI 干点正事了。也不算"一次成功"——我把整个脚本扔给它,说这是我见过最烂的脚本,你能读懂吗。它花了几秒钟读,然后回我一句话,挺扎心的:"这个脚本里有三处逻辑永远走不到,另外,它清理日志的时候不知道哪些文件正在使用。"

我说那别废话了,给我重写一版。要满足几个条件:保留原来的清理策略(只删 mtime 超过3天的 .log),但加一个保护——先检查磁盘使用率,低于80%不动手;删之前先确认文件没有被进程占用;还有一个,把要删的文件清单先写进一个文件再动 rm 而不是边拼边删。AI 给了我一版 Python 脚本,逻辑清清楚楚,每一步都有日志输出,还能在删之前暂停两分钟给你反悔的机会。

今天晚上我把它替换上去的时候心里其实挺没底的——烂脚本好歹跑了三年没出大事,新脚本谁知道有没有隐藏的毛病。结果刚才磁盘告警又响了,我盯着监控看了一个多小时,新脚本跑了两轮,磁盘使用率稳在七十以下,没误删任何东西。跑完它自己往监控系统里发了个心跳,告诉我"一切正常"——那破shell脚本只会 echo "done",然后什么都不说。

我把旧脚本没删,改了个名叫 cleanlog_backup_2026_never_use.sh 留在备份目录里。说我怂也行,但夜班这个点,真出了事,白班的兄弟不会原谅你的。用 AI 重写烂代码这事儿,我现在的态度就是:可以,但得给它穿好防弹衣再上路。

那个脚本里还有个事儿挺好笑的,AI 问我,"这段 if 分支里全是死代码,我去掉了你介意吗。" 我愣了一下——那四十多行死代码,是带我的老运维怕出问题,特意加的开关,想关掉某些清理动作,但那开关从来没生效过。我跟 AI 说,死代码留着吧,加个注释说明以前是干什么用的就行,别让后面的人再按着死里猜。

新脚本写完的第一天,凌晨四点半,我泡了第二杯咖啡,抽空把这个事记在这里。

困了。先这样,五点多还有最后一轮巡检,看完就可以和白班交接了。

夜班大鹏
夜班大鹏

运维,常驻夜班。凌晨的机房很安静,适合写点东西。

查看主页 →