Python 芹菜Django作为守护进程:未找到设置
通过以下步骤,我现在有了一个芹菜Django应用程序,如果我使用以下命令启动worker,它可以正常工作: 芹菜-myapp工作者-n工作者1.%h 在Django settings.py中,我为芹菜设置了所有参数(messages broker的IP等)。一切都很顺利 我现在的下一步是作为守护进程运行这个应用程序。所以我遵循了这一点,一切都很简单,除了现在,settings.py中包含的芹菜参数没有加载。例如,MessageBroker IP设置为127.0.0.1,但在my settings.py中,我将其设置为另一个IP地址 在教程中,他们说: 确保定义芹菜应用程序实例的模块也为DJANGO_设置_模块设置了默认值,如中的DJANGO项目示例所示 所以我确定了。我在/etc/default/celeryd中有以下内容: 导出DJANGO\u设置\u MODULE=“myapp.SETTINGS” 仍然不工作。。。所以我在/etc/init.d/celeryd中也有这一行,同样不起作用。 我不知道该怎么办了。有人有线索吗 编辑: 这是我的芹菜Python 芹菜Django作为守护进程:未找到设置,python,django,celery,daemon,Python,Django,Celery,Daemon,通过以下步骤,我现在有了一个芹菜Django应用程序,如果我使用以下命令启动worker,它可以正常工作: 芹菜-myapp工作者-n工作者1.%h 在Django settings.py中,我为芹菜设置了所有参数(messages broker的IP等)。一切都很顺利 我现在的下一步是作为守护进程运行这个应用程序。所以我遵循了这一点,一切都很简单,除了现在,settings.py中包含的芹菜参数没有加载。例如,MessageBroker IP设置为127.0.0.1,但在my settings
from __future__ import absolute_import
import os
from django.conf import settings
from celery import Celery
# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myapp.settings')
app = Celery('myapp')
# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
编辑#2:
这是我的/etc/default/celeryd:
# Names of nodes to start
# most will only start one node:
CELERYD_NODES="worker1.%h"
# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
# App instance to use
# comment out this line if you don't use an app
CELERY_APP="myapp"
# Where to chdir at start.
CELERYD_CHDIR="/home/ubuntu/myapp-folder/"
# Extra command-line arguments to the worker
CELERYD_OPTS=""
# %N will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%N.log"
CELERYD_PID_FILE="/var/run/celery/%N.pid"
# Workers should run as an unprivileged user.
# You need to create this user manually (or you can choose
# a user/group combination that already exists, e.g. nobody).
CELERYD_USER="ubuntu"
CELERYD_GROUP="ubuntu"
# If enabled pid and log directories will be created if missing,
# and owned by the userid/group configured.
CELERY_CREATE_DIRS=1
# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE=myapp.settings
export PYTHONPATH=$PYTHONPATH:/home/ubuntu/myapp-folder
问题很可能是
celeryd
找不到您的Django设置文件,因为myapp.settings
不在$PYTHONPATH
中,然后应用程序运行
据我回忆,Python在导入文件时会查看$PYTHONPATH
以及本地文件夹。当运行celeryd
时,它可能会检查模块app
的路径,但找不到它,然后在当前文件夹中查找带有\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuupy
(即python模块)的文件夹app
我认为您需要做的就是将其添加到您的/etc/default/celeryd
文件中:
export $PYTHONPATH:path/to/your/app
下面的方法不帮助运行celeryd,而是帮助将celery worker作为服务运行,该服务将在引导时启动 类似这样的命令
sudo service芹菜status
也可以使用
芹菜.conf
# This file sits in /etc/init
description "Celery for example"
start on runlevel [2345]
stop on runlevel [!2345]
#Send KILL after 10 seconds
kill timeout 10
script
#project(working_ecm) and Vitrualenv(working_ecm/env) settings
chdir /home/hemanth/working_ecm
exec /home/hemanth/working_ecm/env/bin/python manage.py celery worker -B -c 2 -f /var/log/celery-ecm.log --loglevel=info >> /tmp/upstart-celery-job.log 2>&1
end script
respawn
在第二个教程中,他们将django_设置变量设置为:
export DJANGO_SETTINGS_MODULE="settings"
这可能是您的设置在更改到目录时找不到的原因
“/home/ubuntu/myapp文件夹/”
然后你用“myapp”定义你的应用,然后你说设置在“myapp.settings”中
这可能导致它在中搜索设置文件
“/home/ubuntu/myapp文件夹/myapp/myapp/settings”
因此,我的建议是删除DJANGO_SETTINGS_模块变量中的“myapp”。不要忘记引号,这里的所有答案都可能是解决方案的一部分,但最后,它仍然不起作用。 但我终于成功地让它工作了 首先,在
/etc/init.d/celeryd
中,我更改了这一行:
CELERYD_MULTI=${CELERYD_MULTI:-"celeryd-multi"}
作者:
第一个被标记为不推荐,这可能是问题所在
此外,我将此作为选项:
CELERYD_OPTS=“--app=myapp”
不要忘记导出一些环境变量:
# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE="myapp.settings"
export PYTHONPATH="$PYTHONPATH:/home/ubuntu/myapp-folder"
有了所有这些,我现在开始工作了。我想为最近遇到这个问题的任何人补充一个答案 我遵循了《芹菜4.4.7 T恤入门指南》以及《不走运的守护程序》教程 我的第一期:
工作正常(实际芹菜配置正常)芹菜-应用程序名工人-l信息
- 我可以启动celeryd,因为守护进程和状态命令将显示OK,但无法接收任务。在查看日志时,我看到了以下内容:
[2020-11-01 09:33:15620:错误/MainProcess]使用者:无法连接到amqp://guest:**@127.0.0.1:5672/:[Errno 111]连接被拒绝。
- 这表明celeryd没有连接到我的经纪人(redis)。鉴于我的配置中已经设置了CELERY_BROKER_URL,这意味着我的CELERY应用程序设置没有被拉入守护进程
- 我试着
查看我的芹菜设置是否被拉入,我注意到sudo C_FAKEFORK=1 sh-x-l-E/etc/init.d/celeryd start
被设置为默认app
(而不是default
/etc/default/celeryd>中指定为
的应用名称)celery_app
celery-A app_name worker-l info
起作用,因此通过在/etc/default/celeryd/
中导出芹菜应用程序,而不仅仅是根据文档设置变量,解决了此问题
博士
如果芹菜-A app_name worker-l info
有效(将app_name替换为您在芹菜第一步指南中定义的名称),并且sudo C_FAKEFORK=1 sh-x-l-E/etc/init.d/celeryd start
未显示正在拉入芹菜应用程序设置,请在/etc/default/celeryd
末尾添加以下内容:
导出芹菜APP=“APP\u name”你的芹菜.py文件是什么样子的?你可以在我的第一篇文章中看到芹菜.py。你有什么想法吗?你有这行[CELERYD\u CHDIR=“/some\u dir/myapp/”]在/etc/default/celeryd中?我已经有几年没有尝试配置芹菜了。我真的希望它能变得更好,但看起来还是和往常一样可怕。为什么在我停止服务芹菜,然后服务芹菜状态之后,它说我的工作人员仍在运行?这可能是与您安装的软件包不同的服务。要确认,请尝试将/etc/init/celery.conf重命名为/etc/init/testxyz.conf…并尝试[sudo服务testxyz start]。
# Name of the projects settings module.
export DJANGO_SETTINGS_MODULE="myapp.settings"
export PYTHONPATH="$PYTHONPATH:/home/ubuntu/myapp-folder"