Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 芹菜Django作为守护进程:未找到设置_Python_Django_Celery_Daemon - Fatal编程技术网

Python 芹菜Django作为守护进程:未找到设置

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

通过以下步骤,我现在有了一个芹菜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中也有这一行,同样不起作用。 我不知道该怎么办了。有人有线索吗

编辑: 这是我的芹菜

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"