我在 Redhat 7.1 上有一个服务,我使用 systemctl 启动、停止、重新启动和状态来控制。有一次 systemctl 状态返回 active,但服务“背后”的应用程序响应的 http 代码与 200 不同。
我知道我可以使用 Monit 或 Nagios 来检查这一点并重新启动 systemctl - 但我想知道使用 systemd 时是否默认存在某些东西,这样我就不需要安装其他工具。
我的首选解决方案是,如果 http 返回代码不同于 200,则完全自动重新启动我的服务,除了 systemd 本身之外,无需其他工具 - (也许可以通知 Hipchat 房间或发送电子邮件...)
systemd 有一个本机(基于套接字)健康检查方法,但它不是基于 HTTP 的。不过,您可以编写一个垫片来通过 HTTP 轮询状态并将其转发到本机机制。
systemd 世界中正确的做法是使用
sd_notify
套接字机制在应用程序完全可用时通知 init 系统。对您的服务使用 Type=notify
来启用此功能。
您可以使用 sd_notify() 调用直接写入此套接字,或者您可以检查
NOTIFY_SOCKET
环境变量以获取名称,并在应用程序返回 200 秒时让您自己的代码将 READY=1
写入该套接字。
如果您想将其放到一个单独的进程中,该进程通过 HTTP 轮询您的进程,然后写入套接字,您可以这样做 - 确保
NotifyAccess
设置正确(默认情况下,只有服务的主进程允许写入套接字)。
由于您有兴趣检测应用程序在完全初始化后失败的情况并触发重新启动,因此
sd_notify
套接字也适合这种情况:
发送
WATCHDOG_USEC=...
设置成功测试之间允许的时间间隔,然后每当您成功自检时发送 WATCHDOG=1
;只要在配置的时间内没有看到成功的测试,您的服务就会重新启动。