s6:如何让运行脚本只运行一次?

s6:如何让运行脚本只运行一次?

我正在使用 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 不要再次启动此服务。

来源:https://skarnet.org/software/s6/s6-svc.html

答案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

相关内容