# start 2 main processes in the background
# one with 1 worker and another with NUM_CPU workers
# each has separate queue
celery multi start 2 -c:1 1 -Q:1 long -Q:2 default
# somehow wait til container is shut down
while true; do sleep 5; done
# fetch termination signal
trap - SIGTERM SIGINT # and maybe INT
# gracefully stop everything
celery multi stop
但这是一个问题:Docker不能将Sigterm发送到我们的脚本,除非其中某个过程代表Docker命令运行(我不知道有相同的PID或其他东西(。
要代表脚本运行一个进程,我们需要添加exec
,使用简单的设置,看起来像这样:
# ...
exec celery -A app worker
但是我们不能将exec
添加到原始脚本中的任何内容,因为在此之后完成工作后,一切都会关闭。
docker stop
不幸的是,不幸的是,如果没有按时处理sigterm,则在特定期间后发送sigkill,这不是芹菜对优雅关闭的期望。
为了做到这一点(相当于控制台中的Ctrl-C(运行docker kill --signal=SIGINT your-container-name
。