我有一个Redhat 7.1服务,我用systemctl启动,停止,重启和状态来控制。 有一次systemctl状态返回激活,但是服务“后面”的应用程序响应的http代码不同于200。
我知道我可以使用Monit或者Nagios来检查这个并且执行systemctl restart – 但是我想知道在使用systemd的时候是否有默认的东西,所以我不需要安装其他的工具。
我的首选解决scheme是,如果http返回代码与200以外的其他工具完全不同,那么我的服务将会重新启动(也许可以通知Hipchat房间或发送电子邮件…)
我试着用Googlesearch这个主题 – 没有运气。 请帮忙 :-)
systemd有一个本地(基于套接字)的健康检查方法,但它不是基于HTTP的。 然而,你可以编写一个通过HTTP轮询状态的填充程序,然后将其转发给本地机制。
systemd世界中的正确事物是使用sd_notify
套接字机制来通知init系统何时应用程序完全可用。 使用Type=notify
为您的服务启用此功能。
您可以使用sd_notify()调用直接写入此套接字,也可以检查NOTIFY_SOCKET
环境变量以获取名称,并在应用程序返回200 NOTIFY_SOCKET
将自己的代码写入READY=1
。
如果你想把它放到一个单独的进程,通过HTTP轮询你的进程,然后写入套接字,你可以这样做 – 确保NotifyAccess
设置正确(默认情况下,只有服务的主进程被允许写入套接字)。
由于您有兴趣检测应用程序在完全初始化后失败并触发重新启动的情况,因此在此方案中也适用sd_notify
套接字:
发送WATCHDOG_USEC=...
设置成功测试之间允许的时间量,然后在您成功进行自检时, WATCHDOG=1
; 每当在配置的时间段内没有看到成功的测试,您的服务将被重新启动。