当受系统监控的服务进入失败状态时获得通知


32

当我的systemd服务崩溃或挂起(即进入失败状态;我使用WatchdogSec =监视挂起)时,我需要发送网络消息。我注意到较新的systemd具有FailureAction =,但是然后看到它不允许任意命令,而只是重新启动/关闭。

具体来说,我需要一种方法,在systemd检测到程序崩溃时发送一条网络消息,而在检测到程序挂起时发送另一条消息。

我希望有一个比“解析日志”更好的答案,并且我需要一些响应时间很短的东西,因此我认为轮询方法不是很好;它应该是事件发生触发的事件。


您能否提供一个示例(甚至是无效的示例)来说明您要实现的目标?
dawud

您能否编辑问题以添加此信息,而不是在评论中添加它?:)
dawud

Answers:


31

systemd单元支持OnFailure,它将在单元发生故障时激活一个(或多个)单元。你可以放一些东西

 OnFailure=notify-failed@%n

然后创建notify-failed@.service服务,您可以在其中使用所需的说明符 (您可能需要至少%i)来启动将发送通知的脚本或命令。

您可以在http://northernlightlabs.se/systemd.status.mail.on.unit.failure中看到一个实际示例


5
链接站点上的说明需要进行一些更正。首先,notify%n.service是多余的,将导致notify@my-service.service.service。其次,%i应使用而不是%I,否则名称中的所有破折号都将转换为正斜杠。
orodbhen

4
有没有一种方法可以对多个或所有单元执行此操作,而无需修改其单元文件?
弗拉基米尔·潘捷列夫

16

只是我的通知方式:

/etc/systemd/system/notify-email@.service

[Unit]
Description=Sent email 

[Service]
Type=oneshot
ExecStart=/usr/bin/bash -c '/usr/bin/systemctl status %i | /usr/bin/mailx -Ssendwait -s "[SYSTEMD_%i] Fail" your_admin@company.blablabla'

添加到systemd:

systemctl enable /etc/systemd/system/notify-email@service

在其他服务处添加:

[Unit]
OnFailure=notify-email@%i.service

重新加载配置:

systemctl daemon-reload

有没有一种方法可以避免连续多次触发它?在某些情况下,接收到关于服务的1000封电子邮件,这些电子邮件在晚上失败了,并一遍又一遍地尝试重新启动自身,这没有帮助。
starbeamrainbowlabs

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.