【问题标题】:"celeryd stop" is not working“芹菜停止”不起作用
【发布时间】:2014-06-16 13:46:19
【问题描述】:

我以一种不常见的方式使用 celery - 我在 celery 启动时创建自定义进程,这个进程应该在 celery 运行时一直运行。 芹菜工人在他们的任务中使用这个过程(不需要详细信息)。

我从命令行运行 celery,一切正常:

celery -A celery_jobs.tasks.app worker -B --loglevel=warning

但是当我使用celeryd 守护 celery 时,没有办法阻止它。 命令celeryd stop 尝试停止 celery 但从未停止。

当我在这两种情况下检查进程树时,有区别 - 从命令行运行时,父进程显然是 celery 进程(主进程有 celery worker 作为子进程)。杀死(停止)父 celery 进程将停止所有 celery 工人和我的自定义进程。

但是当使用celeryd 运行时,我的自定义进程有父/sbin/init - 并且调用celeryd stop 不起作用 - 似乎主 celery 进程正在等待某些东西,或者无法停止我的自定义进程。不是 celery 的子进程。

我对流程了解不多,也不容易找到信息,因为我不知道我应该搜索什么,所以任何提示都非常感谢。

【问题讨论】:

    标签: python celery celeryd


    【解决方案1】:

    我也遇到了同样的问题。我需要一个快速的解决方案,所以我编写了这个 bash 脚本

    #/bin/bash
    
    /etc/init.d/celeryd stop
    sleep 10
    export PIDS=`ps -ef | grep celery |grep -v 'grep' | awk '{print $2}'`
    for PID in $PIDS; do kill -9 $PID; done;
    

    如果进程在 10 秒后没有停止,这是一个长时间停止的候选,所以我决定突然停止

    【讨论】:

    • 感谢您的快速修复,如果我找不到其他解决方案,它会很有帮助。
    【解决方案2】:

    我假设您的自定义进程不是您的任何池工作进程的子进程,并且不必如此。

    我使用 supervisord 而不是 celeryd 来守护工作人员。它也可以用于守护其他进程。比如你的自定义流程。

    在您的情况下,您的 supervisord.conf 可以有多个部分。每个 celery 工作节点一个,一个(或多个)用于您的自定义进程。

    当您终止 supervisord 进程(使用 -TERM)时,它将负责终止所有工作人员和您的自定义进程。如果您使用 -TERM,则需要确保您的自定义进程能够处理它们。

    【讨论】:

    • 我接受了这个答案,因为我认为这个解决方案更干净。
    猜你喜欢
    • 2023-03-02
    • 1970-01-01
    • 2013-07-01
    • 2016-04-24
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-13
    相关资源
    最近更新 更多