【问题标题】:Django celery daemon gives 'supervisor FATAL can't find command', but path is correctDjango celery daemon 给出'supervisor FATAL can't find command',但路径是正确的
【发布时间】:2019-01-16 06:27:34
【问题描述】:

概述:

我正在尝试将 celery 作为守护进程运行以执行发送电子邮件的任务。它在开发中运行良好,但在生产中却不行。我现在有我的网站,并且每个功能都可以正常工作(没有 django 错误),但是由于未正确设置守护程序,因此任务没有完成,并且我在 ubuntu 16.04 中收到此错误:

project_celery FATAL can't find command '/home/djangodeply/myvenv/bin/celery'

已安装的程序/硬件,以及我目前所做的:

我在 VPS 上使用 Django 2.0.5、python 3.5、ubuntu 16.04、rabbitmq 和 celery。我用一个venv来做这一切。我也安装了supervisor,当我检查sudo service --status-all时它正在运行,因为它旁边有一个+。 Erlang 也已安装,当我检查 top 时,rabbitmq 正在运行。使用sudo service rabbitmq-server status 表示rabbitmq 也处于活动状态。

最初,我按照celery website 的指示进行操作,但它们非常令人困惑,经过大约 40 小时的测试/阅读/观看其他人的解决方案后,我无法让它工作。感到非常恼火和失败,我选择了方向here 来设置守护进程,希望我能到达某个地方,我已经走得更远了,但我得到了上面的错误。

我通读了主管文档,检查了process states 以尝试调试问题,并检查了program settings,我迷路了,因为据我所知,我的路径是正确的,根据文档。

这是我精简的文件结构:

home/
    djangodeploy/               # is a superuser
        portfolio-project/
            project/
                __init__.py
                celery.py
                settings.py     # this file is in here too
            app_1/
            app_2/
            ...
            ...
        logs/
            celery.log
        myvenv/
            bin/
                celery       # executable file, is colored green
    celery_user_nobody/      # not a superuser, but created for celery tasks
etc/
    supervisor/
        conf.d/
            project_celery.conf

这是我的 project_celery.conf:

[program:project_celery]
command=/home/djangodeply/myvenv/bin/celery worker -A project --loglevel=INFO
directory=/home/djangodeploy/portfolio-project/project
user=celery_user_nobody
numprocs=1
stdout_logfile=/home/djangodeploy/logs/celery.log
stderr_logfile=/home/djangodeploy/logs/celery.log
autostart=true
autorestart=true
startsecs=10
stopwaitsecs = 600
stopasgroup=true
priority=1000

这是我的 init.py:

from __future__ import absolute_import, unicode_literals
from .celery import app as celery_app
__all__ = ['celery_app']

这是我的 celery.py:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings')
app = Celery('project')

app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)

def debug_task(self):
    print('Request: {0!r}'.format(self.request))

更新:这是我的 settings.py:

这是我唯一的设置,因为celery website django instructions 的示例仅显示了其他内容,除非我要使用 redis 之类的东西。我把它放在我的 settings.py 文件中,因为 django 说明说你可以:CELERY_BROKER_URL = 'amqp://localhost'

更新:我创建了 rabbitmq 用户:

$ sudo rabbitmqctl add_user rabbit_user1 mypassword
$ sudo rabbitmqctl add_vhost myvhost
$ sudo rabbitmqctl set_user_tags rabbit_user1 mytag
$ sudo rabbitmqctl set_permissions -p myvhost rabbit_user1 ".*" ".*" ".*"

当我执行sudo rabbitmqctl status 时,我得到Status of node 'rabbit@django2-portfolio',但奇怪的是,我没有看到任何节点运行如下,因为方向here 表明我应该看到:

{nodes,[rabbit@myhost]},
{running_nodes,[rabbit@myhost]}]

我遵循的步骤:

  1. 我在我说的地方创建了 .conf 和 .log 文件。
  2. sudo systemctl 启用主管
  3. sudo systemctl 启动主管
  4. sudo supervisorctl 重读
  5. sudo supervisorctl 更新# no errors up to this point
  6. sudo supervisorctl 状态

在 6 之后我得到这个错误:

project_celery FATAL can't find command '/home/djangodeply/myvenv/bin/celery'

更新:我检查了错误日志,我在 /var/log/rabbitmq/rabbit@django2-portfolio.log 中有以下多个实例:

=INFO REPORT==== 9-Aug-2018::18:26:58 ===
connection <0.690.0> (127.0.0.1:42452 -> 127.0.0.1:5672): user 'guest' authenticated and granted access to vhost '/'

=ERROR REPORT==== 9-Aug-2018::18:29:58 ===
closing AMQP connection <0.687.0> (127.0.0.1:42450 -> 127.0.0.1:5672):
missed heartbeats from client, timeout: 60s

结束语:

有人知道发生了什么吗?当我查看 project_celery.conf 文件中的绝对路径时,我看到所有设置都正确,但显然有问题。仔细查看我的代码,rabbitmq 说没有节点在运行。当我做sudo rabbitmqctl status 时,但是当我做celery status 时芹菜会这样做(它显示OK 1 node online

任何帮助将不胜感激。我什至专门创建了这个帐户,因为我遇到了这个问题。它快把我逼疯了。如果有人需要更多信息,请询问。这是我第一次部署任何东西,所以我不是专业人士。

【问题讨论】:

  • 如果你是shell-ed进入服务器,你可以直接在提示符下运行命令/home/djangodeply/myvenv/bin/celery worker -A project --loglevel=INFO吗?
  • 不,我得到的是-bash: /home/djangodeply/myvenv/bin/celery: No such file or directory。当我进入 /bin/ 文件夹并输入celery worker -A project --loglevel=INFO 时,我得到ImportError: No module named 'project'。这对我来说是一个线索,我现在会对此进行一些研究。
  • 不确定你们是否能在原始问题中看到我的编辑,但我添加了一些可能对我放置“更新”有更多帮助的内容。
  • 您无法从提示符运行命令的事实意味着该文件不存在或没有正确设置它的权限。 ls -la /home/djangodeply/myvenv/bin/celery 报告什么?
  • 如果我从/或其他任何地方这样做,我会得到ls: cannot access '/home/djangodeply/myvenv/bin/celery': No such file or directory,即使那是到达那里的路径。但是如果我直接在ls -la celery的文件夹中检查文件权限,我会得到-rwxrwxr-x 1 djangodeploy djangodeploy 239 Aug 7 17:41 celery

标签: django ubuntu rabbitmq celery supervisord


【解决方案1】:

您可以在project_celery.conf 中尝试以下任何一种方法

command=/home/djangodeply/myvenv/bin/celery worker -A celery --loglevel=INFO
directory=/home/djangodeploy/portfolio-project/project

command=/home/djangodeply/myvenv/bin/celery worker -A project.celery --loglevel=INFO
directory=/home/djangodeploy/portfolio-project/

另外,在celery.py 中,您能否将project 模块的父文件夹添加到sys.path(或确保您已正确打包部署并通过pip 或其他方式安装它)?

我怀疑(从你的 cmets 和 @Jack Shedd 那里你指的是一个不存在的项目,因为目录是相对于魔法 celery.py 文件设置的。)

【讨论】:

  • ヽ༼ຈل͜ຈ༽ノ 天哪,我爱你!刚刚尝试了第一个,它成功了!说真的,我已经在这上面待了 60 个小时,而这一切都是为了修好这条路。两种选择也有效!ヽ༼ຈل͜ຈ༽ノ
猜你喜欢
  • 1970-01-01
  • 2021-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2018-07-13
  • 2021-01-24
  • 1970-01-01
相关资源
最近更新 更多