因此,我有一个 shell 脚本,用于守护 celery,并创建一组作为守护进程运行的工作程序。我希望有一种方法可以在底层源发生更改时重新启动 celery 任务,因为该--autoreload
选项不起作用。
根据我对 celery 文档的阅读,kill -HUP $pid
将终止守护进程 celery,然后使用相同的参数创建一个新进程。但是,当我尝试时,celery 会关闭并且不会重新启动。我的命令有问题吗?celery 启动时会在后台默默失败吗(如果是这种情况,我应该去哪里找出问题所在并查看日志输出)?
字面命令是kill -HUP \`cat /var/run/celery/w1.pid\`
。检查ps aux | grep celery
没有返回任何内容。我发送 kill 信号后根本没有日志文件输出。
有任何想法吗?
答案1
Celery 中的 HUP 处理程序只是启动关闭程序,并在完成时使用与启动进程相同的参数调用 execv。这是一种相当幼稚的方法,因为它不知道它是否会重新启动,但我们还没有找到在信号处理程序中有效的更好的解决方案。
如果您使用,celery multi
那么最好使用该celery multi restart
命令,它也会等待旧工作程序先停止(generic-init.d 脚本使用它作为其重启命令)。
以下是 SIGHUP 处理程序代码:https://github.com/celery/celery/blob/master/celery/apps/worker.py#L280-L295
正如您所看到的,这需要sys.executable
并sys.argv
进行设置,以便可以使用它来重新启动工作者(不确定为什么没有记录)
我不知道是谁开始了这种趋势,但是人们已经开始期望SIGHUP
重新读取配置文件或重新启动,但正确地做到这一点并不总是那么容易,我认为选择在终端窗口关闭时发送的信号是不负责任的;)我们已经多次讨论过删除 Celery HUP 处理程序。
答案2
您确定您查阅的文档适用于实际部署的版本吗?如果该HUP
功能是在比您使用的版本更新的版本中添加的,则默认行为可能是终止该进程。
(如果这没有帮助,我深感抱歉,我没有使用过这个特定的守护进程,而这是我能提供的最好的建议。)