我在 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() https://www.freedesktop.org/software/systemd/man/sd_notify.html致电,或者您可以检查NOTIFY_SOCKET
环境变量来获取名称并编写您自己的代码READY=1
当应用程序返回 200 秒时到该套接字。
如果您想将其推迟到一个单独的进程,该进程通过 HTTP 轮询您的进程,然后写入套接字,您可以这样做 - 确保NotifyAccess
适当设置(默认情况下,仅允许服务的主进程写入套接字)。
由于您有兴趣检测应用程序在完全初始化后失败的情况并触发重新启动,因此sd_notify
套接字也适合这种情况:
Send WATCHDOG_USEC=...
设置成功测试之间允许的时间量,然后WATCHDOG=1
每当您成功进行自检时;只要在配置的时间内没有看到成功的测试,您的服务就会重新启动。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)