服务器上有一些重要服务若下线则需马上进行处理,用systemd中的OnFailure结合Gotify能同时兼顾轻量和迅速的优点。

安装Gotify

关于Gotify的优缺点和部署方法可参考这篇文章

设置gotify-warning服务

创建/etc/systemd/system/gotify-warning@.service文件。注意其中的@说明这是一个模板服务,可生成多个实例。

1
2
3
4
5
6
7
8
9
10
[Unit]
Description=Gotify Warning

[Service]
Type=oneshot
ExecStart=/usr/bin/curl -s \
--form-string "title=%H" \
--form-string "message=service %I at %H failed" \
--form-string "priority=5" \
https://example.com/gotify/message?token=你的令牌

其中%Hhostname%I为服务名称。
由于此服务是按需触发,故无需enable。

编辑相关服务的配置文件

[Unit]下添加一行OnFailure=gotify-warning@%n。其中%n是该服务名。
以某个服务为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[Unit]
Description=qqbot
After=network.target
StartLimitIntervalSec=50
StartLimitBurst=3
OnFailure=gotify-warning@%n

[Service]
Type=simple
User=yourname
WorkingDirectory=/opt/qqbot
ExecStart=/usr/bin/java -jar /opt/qqbot/qqbot.jar
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

这里Restart=on-failure为程序下线时自动重启程序,且重启间隔为10秒。但有时重启也不能解决问题,故要用StartLimitBurst对重启次数进行限制,然后StartLimitIntervalSec是总监控时长,这里为50秒内重启3次以上就停止重启。最终触发OnFailure调用服务gotify-warning@qqbot.service给手机发出通知。
注:
StartLimitIntervalSecsystemd v230后的版本才有的功能,某些古早CentOS(7.x)仅支持StartLimitInterval且要放在[Service]处。
设定StartLimitIntervalSec时不仅要求其大于StartLimitBurst*RestartSec,还要加上程序正常启动直至崩溃的时间。以上为例:若该程序启动后10秒才崩溃,则3*(10+10)=60>50,则永远不会超出限制并触发OnFailure。此时应将StartLimitIntervalSec设为70甚至90更为合理。

参考资料

systemd.unit manual
Gotify - Push messages