我正在使用 s6 (http://skarnet.org/software/s6/) 来监督多个进程。
我的/etc/s6/
文件夹中有几个服务,其中一个只需start
要从 init.d 脚本调用操作。
到目前为止,脚本已经启动正常,但随后它会一次又一次地尝试重新启动。
有没有什么办法可以避免这种情况?
答案1
如果您的服务是一次性的,即它需要运行一次然后终止,但不需要保持活动状态,那么它就不适合进行监管。进程监管仅适用于长时间运行的进程,又称守护进程。
解决您的问题的正确方法是将您的一次性脚本从监督服务集中取出,并在初始化过程的某个时间点运行它,而无需尝试让 s6-svscan/s6-supervise 管理它。
答案2
您可以使用 s6 执行此操作,方法是将其包含s6-svc -O /etc/s6/servicefolder
在运行脚本的开头。这将告诉 s6 不要再次启动此服务。
答案3
如果 s6 在 docker 容器中运行并且您无法控制它如何启动,那么您就无法使用s6-svc -O /etc/s6/my_service
。
假设容器中的 s6 的服务位于/etc/s6/
,您可以改为执行以下操作:
docker-compose.yml
:
volumes:
- ./data:/data # a mapped or named volume
- ./run:/etc/s6/custom/run:ro
run
:
#!/bin/sh
# ensure not run (successfully) before
if [ -f /data/custom-init-performed ]; then
echo 'INFO: custom init already performed'
s6-svc -D /etc/s6/custom # prevent s6 from restarting service
exit 0
fi
# ensure container healthy
# if you're using healthchecks then use whatever url is applicable here
# if not, use another approach to determine whether container is ready
until [ $(curl -sf http://localhost:3000/api/healthz | grep -E '^ "status": "pass",$' | wc -l) = 1 ]; do
echo 'WARN: container not healthy yet, will retry...' >&2
sleep 5
done
# do once-only init work
# ...
# prevent script's core logic from running again
touch /data/custom-init-performed
# prevent s6 from restarting service
s6-svc -D /etc/s6/custom
exit 0