脚本执行出错时自动发邮件需三步:先配置系统mail命令可用,再用$?捕获错误并触发告警,最后通过crontab绝对路径调用确保环境一致;还需区分失败必报、成功选报、连续失败防刷。

脚本执行出错时自动发邮件,关键不是“加一行 mail 命令”,而是让失败能被准确捕获、环境能稳定发信、通知能真正触达。核心就三点:先让系统能发邮件,再在脚本里判断错误,最后用 crontab 正确触发。
确保 mail 命令可用且配置正确
没发信能力,告警就是摆设。不同系统安装方式略有差异:
- Ubuntu/Debian:sudo apt install mailutils
- CentOS/RHEL:sudo yum install mailx 或 sudo dnf install mailx
编辑 /etc/mail.rc,追加 SMTP 配置(以 QQ 邮箱为例):
set from=yourname@qq.com<br>set smtp=smtps://smtp.qq.com:465<br>set smtp-auth-user=yourname@qq.com<br>set smtp-auth-password=你的SMTP授权码<br>set smtp-auth=login<br>set ssl-verify=ignore
测试是否生效:echo "测试" | mail -s "告警测试" yourname@163.com,收到即通。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
在脚本中用 $? 捕获并响应错误
每条命令执行后,$? 保存其退出状态:0 表示成功,非 0 表示失败。把判断逻辑紧接在关键命令之后:
tar -czf /backup/www.tar.gz /var/www<br>if [ $? -ne 0 ]; then<br> echo "【备份失败】$(date):/var/www 路径不存在或权限不足" | mail -s "❌ 网站备份异常" admin@example.com<br> exit 1<br>fi
建议同步记录日志:echo "$(date) backup failed: $? " >> /var/log/backup.log,便于回溯原因。
用 crontab 触发时注意执行环境
cron 默认使用极简 shell 环境,常导致 mail 找不到或配置不加载。务必做到:
- 使用绝对路径调用解释器和脚本,例如:0 3 * * * /bin/bash /opt/scripts/deploy.sh
- 避免在 crontab 中使用 ~ 或 $HOME,它们不会被解析
- 如仍失败,可在脚本开头显式加载配置:source /etc/profile 或 . /etc/mail.rc
区分场景发送不同内容的邮件
只报错不报喜易忽略常态,全量通知又易疲劳。推荐按结果差异化处理:
- 失败必报:标题加 ❌ 或 【紧急】,正文中明确错误线索(如 No space left on device 或 Connection refused)
- 成功可选报:尤其对关键任务,内容含时间、耗时、生成文件大小等简要信息
- 连续失败可加防刷机制:比如检查上次成功时间戳,或用临时文件记录最近一次失败 IP/时间,避免重复告警










