优先选bash:系统级巡检依赖df、free、systemctl等内置命令,bash零依赖、启动快、兼容性好;Python仅适合报表渲染或API对接。

巡检脚本该用 bash 还是 Python?
优先选 bash:系统级巡检(CPU、内存、磁盘、进程、服务状态)依赖大量内置命令(df、free、systemctl、ps),用 bash 直接调用零依赖、启动快、兼容性好。Python 适合后续做报表渲染或对接 API,但纯巡检没必要引入解释器开销和环境依赖。
关键指标采集怎么避免误报?
很多脚本直接用 df -h 看磁盘,结果把 /boot 或 /run 这类小容量临时挂载点当瓶颈——实际业务根本不受影响。正确做法是只监控根分区和明确的业务挂载点(如 /data、/var/log):
- 用
df -P | awk '$5+0 > 85 {print $1, $5}'替代df -h,避免本地化导致字段错位 - 内存检查避开
free -m的第二行available字段(旧内核不支持),改用awk '/MemAvailable/ {print $2}' /proc/meminfo - 服务状态用
systemctl is-active --quiet判断,返回码比解析文本更可靠
报告生成时时间戳和输出路径怎么设才不踩坑?
常见错误是写死路径如 /root/report.txt,结果非 root 用户执行失败,或多次运行覆盖旧报告。应该:
- 用
date +%Y%m%d_%H%M%S生成唯一文件名,例如report_$(date +%Y%m%d_%H%M%S).log - 输出路径默认用当前目录(
./),加cd "$(dirname "$0")"确保相对路径稳定 - 开头加权限检测:
[[ $EUID -ne 0 ]] && echo "需 root 权限" >&2 && exit 1,避免静默失败
如何让脚本真正“一键”运行且可维护?
所谓一键,不是双击运行,而是能被 cron 定期调用、人工触发无歧义、出错有明确提示。必须包含:
- shebang 固定为
#!/bin/bash(别用#!/usr/bin/env bash,某些最小化系统没env) - 所有外部命令加存在性检查:
command -v df >/dev/null || { echo "df not found"; exit 1; } - 用
set -e让任意命令失败立即退出,但对可能失败的检查(如systemctl is-active)单独用|| true忽略 - 最后用
echo "报告已生成:$(realpath "$output_file")"输出绝对路径,方便定位
最麻烦的其实是日志轮转和历史报告清理——这一步几乎没人做,结果三个月后 /var/log 下堆满几百个 report_*.log。得额外加个 find . -name "report_*.log" -mtime +7 -delete 才算闭环。











