磁盘告警需先验证mail链路,再用df+awk提取超阈值分区;日志清理须限定目录、严格后缀匹配并预演;rsync推送后须校验服务状态并自动回滚;健康检查应选curl测http响应码,配合超时与可观测性设计。

磁盘使用率超阈值怎么自动发邮件?
能发邮件的前提不是写对 mail -s,而是本地邮件代理真能投出去。很多脚本跑通了 df 和 awk,却卡在“没收到告警”上——八成是 mailx 或 msmtp 没配好,或 SELinux 拦了发送权限。
- 先验证基础链路:
echo "test" | mail -s "test" $(whoami),看能不能收到本地信;失败就别急着加定时任务 - 用
df -h | awk '$5+0 > 85 {print $1, $5}'是可行的,但注意$5含百分号,+0是为强制数值比较,避免字符串比对出错 - 别直接
mail -s "告警" admin@example.com,加-r指定发信人,否则某些邮件网关会拒收匿名信 - 日志必须记全上下文:
echo "$(date '+%F %T') $(hostname) $(df -h | grep '/$' | awk '{print $5,$4}')" >> /var/log/disk-alert.log,只记百分比容易误判(比如 /boot 满了但根分区还剩 40G)
Python 脚本删日志,为什么总删错目录?
用 os.walk() 或 pathlib.Path.rglob() 扫描日志时,最常踩的坑是路径没做白名单过滤,结果把 /var/log/journal 或 /var/log/audit 这类二进制日志也当普通 .log 文件给清了。
- 明确限定范围:只处理
/var/log/nginx/、/var/log/apache2/这类应用日志目录,避开系统级日志区 - 后缀匹配要严格:
if file.suffix == '.log'比if '.log' in file.name安全,防止误删app.log.bak或logrotate.conf - 删除前必须预演:
print(f"[DRY RUN] would remove: {file}"),上线前加个--dry-run参数开关 - 用
file.stat().st_mtime算时间,别依赖mtime的字符串解析——不同 locale 下ls -l时间格式可能不一致
rsync 推配置后怎么确认没推坏?
自动同步最危险的不是传不上去,而是传上去了但服务起不来。比如 Nginx 配置少了个分号,rsync 成功返回,systemctl restart nginx 却静默失败。
新闻,案例,下载及前台页全部生成HTML,属于全自动化、全智能的在线方式管理、维护、更新的网站管理系统功能说明:1.系统管理:管理员管理,可以新增管理员及修改管理员密码;添加管理员。并可以分配权限;生成前台页的HTML2.新闻管理:可以添加、删除、修改新闻,并批量生成所有记录的静态页面;3.案例管理:可以添加、删除、修改案例,并批量生成所有记录的静态页面;4.下载管理:可以添加、删除、修改下载程序
- 推送后必须远程执行校验命令:
ssh user@host 'nginx -t && systemctl is-active --quiet nginx',两个条件都满足才算通过 - 失败时不能只 echo 报错,得立刻回滚:
ssh user@host 'cp /etc/nginx/nginx.conf.bak.$(date -d "yesterday" +\%s) /etc/nginx/nginx.conf' -
rsync加--delete很危险,除非你确定目标端没有手工添加的 conf 片段;更稳妥的是加--exclude='*.bak'和--exclude='*.swp' - 备份文件名里带时间戳不够,得加主机名:
nginx.conf.bak.$(hostname).$(date +%s),否则多台机器并发执行会覆盖彼此备份
健康检查脚本里,nc 和 curl 怎么选?
nc -z host port 只管端口通不通,curl 才能测真实响应逻辑。但用错参数,两者都会假阳性——比如服务进程活着但返回 502,nc 仍显示 OK。
- 端口探测用
nc -z -w 2 localhost 80,-w 2防止卡死;超时设太长会让巡检变慢,设太短又容易漏判 - HTTP 健康检查必须带状态码判断:
curl -f -s -o /dev/null -w "%{http_code}" http://localhost/health | grep -q "^200$",-f让非 2xx 返回非零退出码 - 别用
curl -I查 header 就完事——有些服务对 HEAD 不实现,但 GET 正常;/health接口应支持 GET - 响应时间阈值别硬编码 2 秒,改成变量:
TIMEOUT_SEC=${HEALTH_TIMEOUT:-2},方便不同服务差异化配置
自动化脚本真正难的不是语法,是每一步都得想清楚“它失败时,我怎么知道?知道了又怎么恢复?”——所以所有关键操作,必须有可观测出口(日志)、可逆动作(备份)、可中断机制(超时)。否则越自动,越难救。









