systemd可通过Restart=和ExecStopPost=组合实现服务崩溃邮件告警;配置Restart=on-failure与ExecStopPost=调用脚本,脚本用mail发送含状态码、时间戳及日志片段的告警邮件,并需确保系统邮件服务可用。

systemd 本身不直接提供“服务崩溃发邮件”的内置功能,但可以通过组合 Restart=、ExecStopPost= 和外部脚本,实现在服务异常退出后触发邮件通知。关键不是等崩溃发生再补救,而是让 systemd 在每次非预期终止时主动调用告警逻辑。
配置 Restart 策略并捕获退出事件
在 [Service] 段中启用自动重启的同时,利用 ExecStopPost= 在服务停止后(无论是否由 systemd 主动停止)执行自定义命令。这是最轻量、最可靠的方式,无需轮询或日志解析:
-
设置重启行为:添加
Restart=on-failure(仅非零退出码重启)或Restart=always(所有退出都重启),并配RestartSec=3避免密集重启 -
绑定告警动作:用
ExecStopPost=/usr/local/bin/send-service-down-alert.sh %n %s %r,其中%n是服务名,%s是退出状态码,%r是重启原因(如exit-code) -
注意权限:该脚本需能以
User=指定的用户(或 root)身份发送邮件,且不能阻塞主进程;建议加&后台运行或设TimeoutSec=10
编写轻量告警脚本
脚本只需聚焦“发邮件”,不处理判断逻辑(判断由 systemd 完成)。例如 /usr/local/bin/send-service-down-alert.sh:
- 开头加
#!/bin/bash,确保可执行(chmod +x) - 用
mail -s "ALERT: $1 crashed with status $2 ($3)" admin@example.com <<EOF发送简洁内容 - 正文中包含时间戳、服务名、状态码、最近几行 journal 日志(可用
journalctl -u "$1" --since "1 hour ago" -n 5 --no-pager 2>/dev/null) - 避免依赖复杂工具:优先用系统自带
mail或sendmail -t,不推荐硬编码 SMTP 凭据
确保邮件通道可用
systemd 告警脚本能否发信,取决于系统级邮件配置,而非服务本身:
- 确认
mail命令可用:echo "test" | mail -s "test" your@email.com能成功投递 - 若用
ssmtp或msmtp,检查/etc/ssmtp/ssmtp.conf或~/.msmtprc中的 relay host、认证和 TLS 设置 - 若用
sendmail,确保服务已启动:sudo systemctl enable --now sendmail(CentOS/RHEL)或安装mailutils(Ubuntu/Debian) - 测试时加
set -x到脚本开头,查看实际执行命令和错误输出
验证与调试要点
配置完成后,必须手动触发一次失败来验证全流程是否闭环:
- 用
sudo systemctl daemon-reload && sudo systemctl restart your-service.service加载新配置 - 手动杀死主进程:
sudo pkill -f "your-service-bin",观察是否触发ExecStopPost - 查 journal:
journalctl -u your-service.service -n 20 -o cat,确认脚本被调用且无 Permission denied 或 command not found - 检查收件箱,确认邮件含有效上下文(如时间、状态码、日志片段),而非空内容或乱码


















