优先选bash,因其调用df、free等命令零成本且无依赖;Python仅适用于解析JSON、调用API或生成复杂报表等后续处理。

巡检脚本该用 bash 还是 Python?
优先选 bash,除非你要解析 JSON、调用 API 或做复杂报表。Linux 巡检本质是串起 df、free、uptime、systemctl 这些命令,bash 直接调用零成本,没启动开销,也不用担心目标机器缺依赖。
Python 适合后续把报告发邮件、存数据库或对接 Grafana,但别一上来就写 requests + pandas —— 很多生产机连 pip 都没装,更别说 numpy。
- 纯本地指标采集(磁盘、内存、服务状态)→
bash足够,50 行内搞定 - 需要比对历史趋势、生成 HTML 表格、自动归档 → 加一层
python3做后处理 - 如果目标环境是 CentOS 7 且不能升级,避开
bash4.4+ 的新语法(比如${var@Q}),老系统默认是 4.2
关键指标怎么取才不翻车?
不是所有命令输出都稳定。比如 df -h 在不同 locale 下可能把“已用”列名变成“Used”或“已使用”,直接 awk '{print $5}' 会错位;free 的单位在新版里默认是 kibibytes,但字段顺序也变过。
- 磁盘使用率:用
df -P(POSIX 格式),固定列数,awk '$5 ~ /[0-9]+%/ {print $1, $5}' - 内存剩余:用
free -m | awk '/^Mem:/ {print $7}',不依赖列名,靠行首匹配 - 服务状态:不用
systemctl is-active xxx,它返回 0/1 但不输出文字;改用systemctl show -p SubState --value xxx,始终返回字符串如running或failed - 负载均值:
uptime输出易受干扰,直接读/proc/loadavg前三个字段更可靠
报告生成时路径和权限怎么设?
脚本常因写入权限失败而静默退出。别默认往 /root/report/ 写,很多巡检是普通用户跑的;也别用 date +%F 当文件名——如果脚本每分钟执行一次,会覆盖。
- 输出目录建议设成
/var/log/health-check/,提前chown nobody:nobody并加setgid,避免脚本用 root 跑却写不了日志 - 文件名用
$(hostname -s)-$(date +\%F-\%H\%M).log,保证唯一性,%要转义 - 生成 HTML 报告时,别用
echo "..." > report.html,换行和引号容易崩;改用cat report.html,避免变量意外展开 - 如果最终要压缩归档,用
gzip -c而非gzip,前者输出到 stdout,可直接管道进scp或curl
定时执行后为啥没日志也没报错?
cron 环境和交互式 shell 完全不同:没有 $PATH、没加载 ~/.bashrc、HOME 可能是 /root,脚本里写的相对路径全失效。
- 所有命令写绝对路径:
/usr/bin/df、/bin/systemctl,用which df确认 - 显式设置环境:
PATH=/usr/local/bin:/usr/bin:/bin,开头就 export - 重定向必须完整:
/path/to/check.sh >> /var/log/check.log 2>&1,漏掉2>&1就看不到错误 - 测试 cron 是否生效:先写个
* * * * * date >> /tmp/cron-test.log,确认基础机制通了再上业务逻辑
实际跑起来最麻烦的从来不是采集,而是让脚本在各种老系统、最小化安装、不同发行版上“不报错地沉默运行”。路径硬编码、locale 差异、cron 环境缺失——这些地方一漏,脚本就变成定时哑巴。










