我有一个关键应用程序,它由 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
将单位的名称传递给模板。
答案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 有帮助。以下链接也对我有所帮助:
答案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