【问题标题】:How to run celery as a daemon in production?如何在生产中将 celery 作为守护进程运行?
【发布时间】:2012-12-25 21:31:35
【问题描述】:

我从这里的代码在 /etc/defaults/ 中创建了一个 celeryd 文件:

https://github.com/celery/celery/blob/3.0/extra/generic-init.d/celeryd

现在,当我想将 celeryd 作为守护进程运行并执行以下操作时:sudo /etc/init.d/celerdy 它说找不到命令。我哪里错了?

【问题讨论】:

    标签: python django celery


    【解决方案1】:

    我不确定你在这里做什么,但这些是将 celery 作为守护进程运行的步骤。

    1. 您在链接中引用的文件 https://github.com/celery/celery/blob/3.0/extra/generic-init.d/celeryd 需要复制到您的/etc/init.d 文件夹中,名称为 celeryd
    2. 然后需要在文件夹中创建配置文件 /etc/default 与上面使用的名称 celeryd 脚本。这个配置文件基本上定义了某些变量 以及上述脚本使用的路径。这是an example configuration.
    3. 这个链接Generic init scripts解释了流程,可以参考

    【讨论】:

    • by @Kishor-Pawar :我希望在您的回答中添加一些内容。一旦你创建了这两个文件,你想要启动 celeryd 服务。(service celeryd start) 它可能会抛出像无效用户'celery'这样的错误。这是在带有 CELERY_USER 的 conf 文件(/etc/default/celeryd)中提到的。您可能希望将指定用户更改为当前用户或需要创建新用户。您还需要提供所需的权限。
    • 如果您阅读了 celery 页面上的说明,难怪人们会感到困惑,因为这意味着只有一个文件并且它位于 /etc/default.xml 中。对于具有服务器端 linux 经验的人,您可以解决它,但任何新手都会迷失方向。这个发布的答案应该在说明中
    【解决方案2】:

    我发现这个链接非常有用:How to write an Ubuntu Upstart job for Celery (django-celery) in a virtualenv

    稍微调整一下。我有一个芹菜工人正在使用这个脚本运行:

    (使用 ubuntu 新贵)

    命名为 iamcelery.conf 并将其放在 /etc/init 中(注意:不是 init.d)

    # iamcelery -runs the celery worker as my virtual env user
    #
    #
    # This task is run on startup to start the celery worker as my vritual env user
    
    description "runs the celery worker"
    author "michel van Leeuwen <michel@iamit.nl>"
    
    start on runlevel [2345]
    stop on runlevel [!2345]
    
    # retry if ended unexpectedly
    respawn
    # limit the retries to max 15 times with timeouts of 5 seconds
    respawn limit 15 5
    
    # Time to wait between sending TERM and KILL signals
    kill timeout 20
    
    task
    script
      exec su -s /bin/sh -c 'exec "$0" "$@"' <place here your unprovilegd username> -- srv/<here the path of your django project>/bin/django celeryd -BE -l info
    end script
    

    现在您可以启动这个 scipt(它也在服务器启动时启动):

    sudo start iamcelery
    

    或停止:

    sudo stop iamcelery
    

    或检查其状态:

    sudo status iamcelery
    

    我不确定这是最好的方法……但是……经过长时间的尝试和尝试使 initd 脚本正常工作的错误……(没有成功)……这终于奏效了。

    2013 年 6 月 8 日编辑 我在这里给出的脚本最终似乎以 root 身份运行。 现在我改变了这个:

    script
      su <place here your unprovilegd username>
      cd /srv/<here the path of your django project>/
      exec bin/django celeryd -BE -l info
    end script
    

    进入:

    script
      exec su -s /bin/sh -c 'exec "$0" "$@"' <place here your unprovilegd username> -- srv/<here the path of your django project>/bin/django celeryd -BE -l info
    end script
    

    这很有效,这个问题的答案的所有功劳: How to write an Ubuntu Upstart job for Celery (django-celery) in a virtualenv

    2013 年 9 月 5 日编辑

    还剩下一件小事:我必须在控制台中的 start 命令之后执行 ctrl-c(并在此之后进行状态检查):如果有人知道这一点:留在命令中,我可以更新这个答案...

    【讨论】:

    • 您好,在这种情况下暴发户挂起(但成功启动进程)有什么原因吗?
    • 不确定。一切似乎都奏效了。当您使用 ctrl+c 并执行状态 cmd 时,它会运行。
    【解决方案3】:

    我通常使用supervisor(加上django-supervisor) 用于此目的。这样,您无需弄清楚如何守护应用程序中的每个进程(其中您至少有一个托管 django 的网络服务器,另外celery,加上实际上你用来支持这两者的任何其他中间件)。Supervisor 知道如何将自己作为守护进程运行,而你的所有其他进程作为 supervisor 的子进程运行。

    【讨论】:

    • 所以你安装了supervisor,然后呢?
    • @frankster 那你就用它
    • liunx 完全是一团糟,我有很多选择,因为 init 脚本和 systemd 和 ubuntu upstart 都可以工作。但是为什么我们需要学习所有这些 >>> 相反,我们使用 supervisor 在所有 liunx 上都很好发行版,仅第一次学习..
    【解决方案4】:

    正如 Marcin 在他的回答中解释的那样,主管通常是人们最终使用的东西,但是如果您正在寻找可以与 python3 一起使用的东西,并且等不及主管的版本 4,我认为它将支持 python3你可以选择circus。安装后,您只需要一个 circus.ini 文件,该文件将包含您想要守护的所有进程,然后运行该示例 circus.ini 可能如下所示:

    [watcher:celery]
    cmd = full_path/python3.4 full_path/manage.py celeryd -B -l info
    
    [watcher:celerycamera]
    cmd = full_path/python3.4 full_path/manage.py celery events --camera=djcelery.snapshot.Camera
    
    [watcher:dceleryflower]
    cmd = full_path/python3.4 full_path/manage.py celery flower -A your_app_name --basic_auth=username:password --port=5555 
    

    如果您想了解更多详细信息,我有一篇与同一 here 相关的帖子。希望它可以节省一些时间。谢谢

    【讨论】:

    • 你可以通过supervisor运行任何类型的进程,无论python的哪个版本运行supervisor。当然,你需要两个 virtualenvs,这可能不是完全可取的。
    【解决方案5】:

    注意:在 ubuntu 16.04 中,带有 .conf 文件的分析器不再工作。

    我创建了一个 .service 文件并将其放入 /etc/systemd/system/

    我可以使用

    sudo 服务我的服务状态

    sudo service myservice 启动

    sudo service myservice 停止

    作为命令

    例如这个文件:

    myservice.service:

    [Unit] 
    Description=My celery worker 
    
    [Service]
    WorkingDirectory=/srv/my-project-path
    User=buildout
    Group=buildout
    Restart=on-failure
    RestartSec=20 5
    ExecStart=/srv/my-project/bin/django celeryd -BE
    
    [Install]
    WantedBy=multi-user.target
    Alias=myservice.service
    

    注意我使用的是 buildout,所以在 bin/django 的 setad 中,大多数用户需要使用 python 的路径并使用 mange.py。

    基于:http://minecraft.gamepedia.com/Tutorials/Ubuntu_startup_script(参见 with systemd 部分)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-26
      • 2014-08-30
      • 1970-01-01
      • 2023-03-02
      • 1970-01-01
      • 2015-07-12
      • 2017-03-31
      • 1970-01-01
      相关资源
      最近更新 更多