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

Dis*_*ame 47 linux bash service systemd

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

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

我希望有一个比“解析日志”更好的答案,而且我需要一些具有近乎即时响应时间的东西,所以我认为轮询方法不是很好;它应该是由事件发生触发的东西。

小智 43

systemd 单元支持 OnFailure,它会在单元发生故障时激活一个(或多个)单元。你可以把类似的东西

 OnFailure=notify-failed@%n
Run Code Online (Sandbox Code Playgroud)

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

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

  • 有没有办法对多个或所有单元执行此操作,而无需修改其单元文件? (6认同)
  • 链接网站上的说明需要进行一些更正。首先,`notify%n.service` 是多余的,会导致 `notify@my-service.service.service`。其次,应该使用 `%i` 代替 `%I`,否则名称中的所有破折号都将被转换为正斜杠。 (5认同)
  • 对于想要同时对所有服务文件执行此操作的任何人,请检查 [systemd.unit](https://www.freedesktop.org/software/systemd/man/systemd.unit) 最后的 **示例 3** .html)。您需要将配置放在“service.d”目录下,它将应用于所有服务。 (2认同)

小智 27

只是我的通知方式:

/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'

[Install]
WantedBy=multi-user.target
Run Code Online (Sandbox Code Playgroud)

添加到systemd:

systemctl enable /etc/systemd/system/notify-email@.service
Run Code Online (Sandbox Code Playgroud)

在其他服务中添加:

[Unit]
OnFailure=notify-email@%i.service
Run Code Online (Sandbox Code Playgroud)

重新加载配置:

systemctl daemon-reload
Run Code Online (Sandbox Code Playgroud)

  • 为什么要启用通知服务?它应该由其他单元启动,没有理由在启动时启动它。 (2认同)