Answers:
首先,您需要两个文件:一个用于发送邮件的可执行文件和一个用于启动该可执行文件的.service。对于此示例,可执行文件只是使用sendmail
以下命令的shell脚本:
/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/status-email-user@.service:
[Unit]
Description=status email for %i to user
[Service]
Type=oneshot
ExecStart=/usr/local/bin/systemd-email address %i
User=nobody
Group=systemd-journal
其中user是要发送电子邮件的用户,address是该用户的电子邮件地址。尽管收件人是经过硬编码的,但要报告的单位文件作为实例参数传递,因此该服务可以为许多其他单位发送电子邮件。此时,您可以开始status-email-user@dbus.service
验证您是否可以接收电子邮件。
然后,只需编辑您要为其发送电子邮件的服务,然后将其添加OnFailure=status-email-user@%n.service
到该[Unit]
部分。%n
将单元名称传递给模板。
ExecStartPost
是正确的选择:它还会在“正常”启动后触发,不仅在失败的情况下,对?
@gf_提出的解决方案非常适合我们在CentOS7上运行clickhouse的情况。Clickhouse经常会在我们身上崩溃,因此我们需要使其自动重新启动并在重新启动发生时得到通知。虽然向systemd添加第二个服务似乎有些笨拙,但是由于systemd的设计,这是必要的。
话虽这么说,当这个解决方案与自动重启结合使用时,当我们部署到CentOS8时就停止为我们工作了。这是因为C8中附带的systemd v239 OnFailure=
与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有所帮助。其他一些帮助我的链接:
您可以尝试使用systemd服务选项ExecStartPost。
此处提供描述:
https://www.freedesktop.org/software/systemd/man/systemd.service.html
服务定义文件中可以有更多此选项的声明。它是一一触发的。
您的系统中还将有一些示例。
您可以创建一个Shell脚本来检查服务状态并在服务器启动时发送电子邮件。此链接可能对您有帮助