linux与shell编程指南:7个生产脚本告别备份失败与磁盘告警
备份总失败,磁盘天天报警,脚本像废纸。

我上周在公司运维群里看到三条消息:一条是凌晨三点的磁盘告警截图,一条是备份脚本跑完没校验、恢复时发现包是空的,还有一条是新来的实习生删错了日志,把`/var/log/audit/`整个挪进`/tmp`,第二天审计检查直接卡住。没人骂人,但大家默默把各自写的脚本发出来,比了一圈——八成连`df -P`都不用,还在`grep /`。
真不是吹,我自己也踩过坑。前两天改了个监控HTTP的脚本,加了`curl -I`,结果某次Nginx没启起来,脚本返回200(其实是curl自己返回的默认头),我就信了,等用户打电话来说“网站打不开”才去看。后来翻资料才知道,`curl -I`压根不检查服务状态,只管连得上不。
这7个脚本,是我按着生产环境真实问题一条条抠出来的。不是为炫技,是为少熬点夜。比如备份脚本里加了``,不是为了多一行命令,是因为上个月备份服务器硬盘坏了一块,恢复时才发现tar包末尾3MB读不出来,但没校验,没人知道。现在打包完立刻算哈希,存同目录下,恢复前先核对,错一个字节就停。
磁盘告警那个,我把`/`和`/var/log`分开设阈值。根分区设85%,日志分区放95%。为啥?因为`/var/log`里``和`nginx`日志涨得太野,有时半夜写满,但系统还能撑几小时,没必要一超80%就发邮件轰炸。我加了“三次才报”,中间加了`sleep 60`重测,真卡住再动。
删日志最怕手抖。现在脚本不直接`rm`,先`mv`到`/tmp/.时间戳`,每天凌晨再清一次`/tmp/.*`。上周开发查问题,发现删掉的`debug.log`还在里面,直接拖出来看了两小时。
服务检测原来就一个`ping`,现在是三层:先通不通网,再通不通端口,最后要`curl -s / | grep ok`。不满足就自动重启,重启后还`curl`一遍确认。不是信它能修好,是省得我爬起来敲命令。
密码生成改了熵源。之前用`/dev/`,有次在低配VM里跑出来全是数字,没符号。现在用`od -vAn -N16 -tu4 /dev/ | | cut -c1-12`,慢点,但真随机。生成完立刻`unset `,`ps aux | grep`搜不到。
DNS那块原来就`dig +short`,结果CDN回空,脚本判失败,其实网站好好的。现在同时打三个DNS:8.8.8.8、114.114.114.114,还有本地`-`,三个里两个通就算过。

HTTP监控现在记响应时间。超过2秒单独发一条“响应慢”日志,不混在“挂了”里。我们订单页健康检查接口超时,就是靠这个先发现的,比用户投诉早了17分钟。
所有脚本都加了`set -e`和`set -u`,少个变量名就退出。日志全进`/var/log/`对应目录,带时间戳和脚本名。`cron`全换成了` timer`,因为某次`cron`服务卡住,三个备份任务全没跑,` list-`一眼就看见。
权限全部`chmod 700`,PATH开头就写死`PATH=
/usr/bin:/bin:/usr/local/bin`,不用系统默认那堆。`eval`一个没用,`$()`全换成`$(...)`,空格路径用`-`和`xargs -0`。
我存了个``文件夹,每个脚本配一个`test.sh`:模拟`df`满、模拟`curl`超时、模拟`tar`无权读。改完跑一遍,绿了才上线。
git里每次提交都写清楚改了啥,比如“修复:/var/log清理跳过目录”,不写“优化逻辑”。.md每天同步更新,不是摆设。
扫描当睡前必做,就像刷牙。
写完这些,我删掉了电脑里所有“一键部署”“全自动运维”的旧脚本。它们不是不好,是太干净了,干净得不像在真实服务器上跑过。
现在脚本都在跑,没出大事。
上个月没加班。
























