我有一个使用 systemd 套接字激活的 HTTP 服务(我们称之为 Foo)。我想支持此设置:
- 监控服务告诉 Foo 停止(例如 POST /stop)
- Foo 完成其(可能很长的)工作然后退出。
- 监控服务轮询 Foo 上的 HTTP 端点(例如 GET /are-you-up)等待它退出。
在步骤3中,当监控服务命中/are-you-up时,systemd的套接字激活会重新启动HTTP服务!
我仍然希望 systemd 管理套接字(这样我的服务就不必以 root 身份运行/启动)。我还希望 systemd 在服务崩溃时(非 0 退出代码)重新启动我的服务。
这两种情况都可能吗?
- systemd 管理套接字但不执行套接字激活?
- 或者 Foo 服务在关闭时告诉 systemd 关闭套接字/停止响应它。我尝试让服务运行“systemctl stop foo.socket”,但它以非特权用户身份运行。
总体来说,这项服务正在被替换。关闭后,(云)服务器将被删除。
答案1
对于其他遇到此问题的人,我最终关闭了 HTTP 侦听器,但保持进程运行。在伪代码中,Foo 服务执行的操作如下:
close(httpSocket) print("Stopped") sleep(forever)
这意味着监控服务GET /are-you-up
将知道服务已完成,systemd 不会重新启动它,而我仍然可以享受 systemd 的所有其他优点。实际上,它已经运行了几个月。
如果有更清洁的选项,请添加您的答案。谢谢!