Django celery daemon 给出“supervisor FATAL can't find command”,但路径是正确的
Django celery daemon gives 'supervisor FATAL can't find command', but path is correct
概览:
我正在尝试 运行 芹菜作为发送电子邮件任务的守护进程。它在开发中运行良好,但在生产中运行不佳。我现在有我的网站,每个功能都运行良好(没有 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
时它是 运行ning,因为它旁边有一个 +。 Erlang 也已安装,当我用 top
检查时,rabbitmq 是 运行ning。使用 sudo service rabbitmq-server status
表明 rabbitmq 也处于活动状态。
最初,我按照 celery website, but they were very confusing and I couldn't get it to work after ~40 hours of testing/reading/watching other people's solutions. Feeling very aggravated and defeated, I chose the directions here 中的说明设置了守护进程,希望我能有所作为,我已经取得了进一步的进展,但我得到了上面的错误。
我通读了主管文档,检查了 process states to try and debug the problem, and 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'
,但奇怪的是,我没有看到任何节点 运行ning 如下所示,因为方向 here 表明我应该看到:
{nodes,[rabbit@myhost]},
{running_nodes,[rabbit@myhost]}]
我遵循的步骤:
- 我在我说的地方创建了 .conf 和 .log 文件。
- sudo systemctl 启用主管
- sudo systemctl 启动主管
- sudo supervisorctl 重读
- sudo supervisorctl 更新
# no errors up to this point
- 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 说没有节点 运行ning。当我做 sudo rabbitmqctl status
时,但当我做 celery status
时芹菜会做 (它显示 OK 1 node online
).
如有任何帮助,我们将不胜感激。我什至专门因为遇到这个问题而创建了这个帐户。这让我发疯。如果有人需要更多信息,请询问。这是我第一次部署任何东西,所以我不是专业人士。
您可以在 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
(或者确保您已正确打包部署并通过点或其他)?
我怀疑(根据你对@Jack Shedd 的评论,你指的是一个不存在的项目,因为目录是相对于魔法 celery.py 文件设置的。)
概览:
我正在尝试 运行 芹菜作为发送电子邮件任务的守护进程。它在开发中运行良好,但在生产中运行不佳。我现在有我的网站,每个功能都运行良好(没有 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
时它是 运行ning,因为它旁边有一个 +。 Erlang 也已安装,当我用 top
检查时,rabbitmq 是 运行ning。使用 sudo service rabbitmq-server status
表明 rabbitmq 也处于活动状态。
最初,我按照 celery website, but they were very confusing and I couldn't get it to work after ~40 hours of testing/reading/watching other people's solutions. Feeling very aggravated and defeated, I chose the directions here 中的说明设置了守护进程,希望我能有所作为,我已经取得了进一步的进展,但我得到了上面的错误。
我通读了主管文档,检查了 process states to try and debug the problem, and 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'
,但奇怪的是,我没有看到任何节点 运行ning 如下所示,因为方向 here 表明我应该看到:
{nodes,[rabbit@myhost]},
{running_nodes,[rabbit@myhost]}]
我遵循的步骤:
- 我在我说的地方创建了 .conf 和 .log 文件。
- sudo systemctl 启用主管
- sudo systemctl 启动主管
- sudo supervisorctl 重读
- sudo supervisorctl 更新
# no errors up to this point
- 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 说没有节点 运行ning。当我做 sudo rabbitmqctl status
时,但当我做 celery status
时芹菜会做 (它显示 OK 1 node online
).
如有任何帮助,我们将不胜感激。我什至专门因为遇到这个问题而创建了这个帐户。这让我发疯。如果有人需要更多信息,请询问。这是我第一次部署任何东西,所以我不是专业人士。
您可以在 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
(或者确保您已正确打包部署并通过点或其他)?
我怀疑(根据你对@Jack Shedd 的评论,你指的是一个不存在的项目,因为目录是相对于魔法 celery.py 文件设置的。)