让所有 systemd 定时器在发生错误时向 root 发送邮件

让所有 systemd 定时器在发生错误时向 root 发送邮件

croncrontab向所有者发送有关工作错误的电子邮件。

systemd当计时器运行时我怎样才能做同样的事情?

注意:我不是在寻找向特定服务添加电子邮件通知的方法。或者向多个服务添加。理想情况下,我不想编程。我只是想知道systemd当任何计时器或服务失败时,如何告诉 root 发送电子邮件。我不敢相信systemd没有通过配置文件中的选项实现这种基本通知。

然而,在实际上systemd缺少这样一个基本功能的令人遗憾的情况下,我可以使用一些与logcheck系统日志类似的外部包。

答案1

是的,看来 systemd 没有实现服务或计时器单元的邮件输出。

不过,我想出了一个简短的解决方案。实际上,我们在 certbot 中遇到了与文章链接中相同的问题。因此,假设您想要监控 certbot.service(在其他情况下,只需替换您的服务名称)。行为与 cron 并不完全相同。当服务手动启动或从计时器启动时失败时,会发送邮件。

mkdir -p /etc/systemd/system/certbot.service.d
cat > /etc/systemd/system/certbot.service.d/mailto.conf <<'EOF'
[Service]
[email protected]
EOF
cat > /etc/systemd/system/certbot.service.d/mailout.conf <<'EOF'
[Service]
# Mail on service error, ignore exitcode for execstoppost
ExecStopPost=-/bin/bash -c 'if [ "$EXIT_STATUS" != "0" ]; then mail -s "ERROR executing certbot" "$MAILTO" <<<"SYSTEMD status \n Service_result: $SERVICE_RESULT \n Exit_code(systemd): $EXIT_CODE \n Exit_status(proc exit code): $EXIT_STATUS\n`journalctl --no-pager -n 20 -u certbot`"; fi'
EOF

systemctl daemon-reload

最后,但并非最不重要的一些观点(也阅读了https://www.worthe-it.co.za/blog/2017-11-07-error-reporting-from-your-systemd-automation.html

这是 systemd 不尊重 Linux 传统的又一典型案例。我认为应该有办法恢复到旧的 cron 行为。另一方面,cron 的态度对某些人来说可能不是最合理的。而且,如果 systemd 为管理员提供配置选项来选择加入邮件输出,那就更好了。

答案2

Systemd 没有原生的电子邮件功能。——@harrymc 提供的链接是一个很好的开始,可以让您用几行代码推出自己的解决方案。

我添加了此使用命令行发送电子邮件的服务(您需要能够通过命令行发送邮件......):

# /etc/systemd/system/[email protected]
[Service]
Type=oneshot
ExecStart=mailx -s "%i failed" [email protected]
StandardInputText=\
 Dear reader:\n\
 \n\
 This is the [email protected] unit writing you regarding:\n\
 %i\n\
 ...

添加一个插入文件,所有服务(当前和将来的)将[email protected]在发生故障时激活:

# /etc/systemd/system/service.d/10-failure-email.conf
[Unit]
OnFailure=failure-email@%n

(重新启动或执行systemctl daemon-reload以完成设置。)

相关内容