用df / | tail -1 | awk '{print $5}' | sed 's/%//'可精准提取根分区使用率纯数字,避开表头与多挂载点干扰,适配不同发行版输出差异。

怎么用 df 获取准确的根分区使用率
直接跑 df -h 会列出所有挂载点,但监控通常只关心根分区(/)或关键数据盘(比如 /data),不加过滤容易误报。注意 df 默认按文件系统统计,如果用了 LVM 或 overlayfs,得确认目标挂载点对应的实际设备是否稳定——比如容器环境里 / 可能是 tmpfs,不能当真。
推荐用这一行精准提取根分区使用率数字:
df / | tail -1 | awk '{print $5}' | sed 's/%//'
它避开表头、取最后一行、提取第五列(已用百分比)、去掉 % 符号,输出纯数字,方便后续比较。别用 df -P 配正则——不同发行版 df 输出列数可能微调,tail -1 + awk '{print $5}' 更稳。
Shell里怎么写可靠的阈值判断和告警触发逻辑
Shell 的 [ ] 对数字比较支持 -gt,但必须确保变量是纯整数。如果 df 输出异常(比如磁盘不可读返回空或错误),sed 's/%//' 会输出空字符串,直接进 [ "$used" -gt 85 ] 就报错:[: -gt: unary operator expected。
安全写法要加两层防护:
- 用
set -u开头避免未定义变量静默失败 - 给
used设默认值,并用[[ "$used" =~ ^[0-9]+$ ]]校验是否为数字 - 比较前先检查
df命令是否成功($? == 0)
片段示例:
used=$(df / 2>/dev/null | tail -1 | awk '{print $5}' | sed 's/%//')
if [[ $? -ne 0 ]] || [[ ! "$used" =~ ^[0-9]+$ ]]; then
echo "WARN: df failed or output malformed"
exit 1
fi
if [ "$used" -gt 85 ]; then
echo "$(date): Disk usage $used% on /, triggering alert" | mail -s "ALERT: High disk usage" admin@example.com
fi
发邮件告警为什么经常失败?关键依赖是什么
绝大多数 Linux 服务器默认没装完整 MTA(邮件传输代理),mail 命令看似存在,实际调用的是 mailx 或 heirloom-mailx,它们依赖本地 sendmail 或配置好的 SMTP。直接执行 mail -s ... user@x 十有八九静默丢弃。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
验证方法:echo test | mail -s test root,然后查 /var/log/mail.log 或 systemctl status sendmail。更现实的做法是绕过本地 MTA:
- 用
curl调企业微信/钉钉机器人 Webhook(免配置,适合内网) - 用
ssmtp或msmtp配一个轻量 SMTP 客户端(需提供邮箱账号密码或 AppKey) - 写入本地日志并由
logrotate或外部监控系统(如 Zabbix)统一抓取
别在脚本里硬编码密码;用 msmtp 时把账号存在 ~/.msmtprc 并 chmod 600。
定时运行时要注意的 PATH 和权限陷阱
cron 执行环境 PATH 极其精简(通常是 /usr/bin:/bin),而你测试时用的是交互式 shell,PATH 包含 /usr/local/bin 等。脚本里调用的 awk、mail、甚至自定义二进制工具,cron 可能根本找不到。
两个对策必须选一个:
- 在 crontab 里显式声明 PATH:
PATH=/usr/local/bin:/usr/bin:/bin - 脚本开头用绝对路径写死命令:
/usr/bin/df、/usr/bin/awk、/usr/bin/mail
另外,cron 默认以当前用户身份运行,如果监控的是需要 root 权限的路径(如 /boot),要么改用 root 用户的 crontab(sudo crontab -e),要么确保脚本本身有足够权限——但别给脚本加 setuid,不安全。
真正麻烦的是 NFS 挂载点卡住时 df 会 hang 住,导致 cron 任务堆积。加超时:用 timeout 10 df /,避免整个监控链路阻塞。










