16

我在 Redhat 7.1 上有一个服务,我使用 systemctl start、stop、restart 和 status 来控制。有一次 systemctl 状态返回活动状态,但服务“后面”的应用程序响应的 http 代码与 200 不同。

我知道我可以使用 Monit 或 Nagios 来检查这一点并重新启动 systemctl - 但我想知道在使用 systemd 时是否存在默认情况,这样我就不需要安装其他工具。

我的首选解决方案是,如果 http 返回码与 200 不同,则在没有 systemd 本身以外的其他工具的情况下完全自动重新启动我的服务 - (并且可能有可能通知 Hipchat 房间或发送电子邮件......)

我试过用谷歌搜索这个话题——没有运气。请帮忙 :-)

4

1 回答 1

19

简短的回答

systemd 有一个原生的(基于套接字的)健康检查方法,但它不是基于 HTTP 的。但是,您可以编写一个通过 HTTP 轮询状态并将其转发到本机机制的 shim。


长答案

systemd 世界中的正确做法是使用sd_notify套接字机制在您的应用程序完全可用时通知 init 系统。用于Type=notify您的服务以启用此功能。

您可以使用sd_notify()调用直接写入此套接字,或者您可以检查环境变量以获取名称并在应用程序返回 200 秒时将NOTIFY_SOCKET您自己的代码写入该套接字。READY=1

如果你想把它放到一个单独的进程中,通过 HTTP 轮询你的进程,然后写入套接字,你可以这样做——确保NotifyAccess设置得当(默认情况下,只允许服务的主进程写入到插座)。


由于您有兴趣检测应用程序在完全初始化后失败并触发重新启动的情况,因此sd_notify套接字也适用于这种情况:

发送WATCHDOG_USEC=...以设置成功测试之间允许的时间量,然后WATCHDOG=1每当您成功进行自测时;只要在配置的时间段内没有看到成功的测试,您的服务就会重新启动。

于 2016-09-24T18:01:19.853 回答