如果 systemd 服务重启,如何发送电子邮件?

如果 systemd 服务重启,如何发送电子邮件?

我有一个关键应用程序,它由 systemd 作为服务运行。

一旦发生故障它就会立即重新启动。

如果应用程序重新启动,如何发送电子邮件?

答案1

首先,您需要两个文件:一个用于发送邮件的可执行文件和一个用于启动可执行文件的 .service。对于此示例,可执行文件只是一个使用以下内容的 shell 脚本sendmail

/usr/local/bin/systemd-email:

#!/bin/bash

/usr/bin/sendmail -t <<ERRMAIL
To: $1
From: systemd <root@$HOSTNAME>
Subject: $2
Content-Transfer-Encoding: 8bit
Content-Type: text/plain; charset=UTF-8

$(systemctl status --full "$2")
ERRMAIL

无论您使用什么可执行文件,它都应该至少接受两个参数,就像这个 shell 脚本一样:要发送到的地址和要获取其状态的单元文件。我们.service创建的将传递以下参数:

/etc/systemd/system/[email protected]:

[Unit]
Description=status email for %i to user

[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal

在哪里用户用户是否收到了电子邮件地址是该用户的电子邮件地址。虽然收件人是硬编码的,但要报告的单元文件作为实例参数传递,因此该服务可以为许多其他单元发送电子邮件。此时您可以开始[email protected]验证是否可以收到电子邮件。

然后只需编辑您想要电子邮件的服务并添加OnFailure=status-email-user@%n.service到该[Unit]部分。%n将单位的名称传递给模板。

来源:archlinux wiki:systemd 计时器 MAILTO

答案2

@gf_ 提出的解决方案对于我们在 CentOS7 上运行 clickhouse 的情况非常有效。Clickhouse 经常崩溃,因此我们需要让它自动重启并在重启时收到通知。虽然向 systemd 添加第二个服务似乎有点笨拙,但这是 systemd 的设计所必需的。

话虽如此,当我们部署到 CentOS8 时,此解决方案与自动重启结合使用时就停止工作了。这是因为 C8 中附带的 systemd v239OnFailure=与非默认配置结合使用时引入了语义更改Restart=Restart=on-failure在我们的例子中)。新OnFailure=行为仅在重启完全失败时触发一次性服务,而不仅仅是在崩溃后触发。这种较新的行为会顺利地重启服务,但我们不会收到电子邮件,因为OnFailure=不再被调用。

请注意我们的主要期望:我们希望 systemd 重新启动该过程并发送电子邮件通知。v239 更新使我们之前由 gf_ 引用的解决方案不再有效。幸运的是,我们能够让它工作。

我们的解决方案是使用ExecStopPost调用电子邮件通知脚本。这很好用,但现在出现了一个新问题:当 clickhouse 服务正常启动时(例如服务器启动时),会发送电子邮件通知。虽然这不是什么大问题,但理想情况下我们希望收到电子邮件通知仅有的崩溃时。我们可以通过在我们的电子邮件脚本中添加以下代码来实现这一点:

# Don't do anything if the service intentionally stopped successfully. if [ $SERVICE_RESULT == "success" ]; then exit fi

... $SERVICE_RESULT是 systemd 提供给 目标进程 的环境变量ExecStopPost。通过检查结果success,我们假设此调用来自正常启动或关闭,因此不执行任何操作。对于任何其他值,例如signal,脚本将继续发送电子邮件。此变量的可能值在文档

感谢 gf_ 提供的初始解决方案。我希望大家觉得我的更新对 CentOS8 有帮助。以下链接也对我有所帮助:

  1. https://superuser.com/questions/1360346/how-to-send-an-email-alert-when-a-linux-service-has-stopped
  2. https://unix.stackexchange.com/questions/422933/confusing-systemd-behaviour-with-onfailure-and-restart
  3. https://unix.stackexchange.com/questions/197636/run-an-arbitrary-command-when-a-service-fails

答案3

您可以尝试使用 systemd 服务选项 ExecStartPost。

描述可以在这里找到:

https://www.freedesktop.org/software/systemd/man/systemd.service.html

服务定义文件中可以有多个此选项的声明。它会逐个触发。

您的系统中也会有一些示例。

答案4

您可以创建一个 shell 脚本来检查服务状态并在服务器启动时发送电子邮件。此链接可能对您有帮助

https://askubuntu.com/questions/814/how-to-run-scripts-on-start-up

相关内容