生产中的守护进程 celery

meh*_*hdi 5 django service celery systemctl

我正在尝试在 Ubuntu 18.04 中将 Celery 作为服务运行,使用安装在env系统范围内的 Django 2.1.1 和 Celery 4.1.1 以及安装的 Celery 4.1.0。我将继续本教程,将 Celery 作为服务运行。这是我的 Django 项目树:

\n\n
    hamclassy-backend\n                 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 apps\n                 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 env\n                 \xe2\x94\x82   \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 bin\n                 \xe2\x94\x82        \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 celery\n                 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 hamclassy\n                 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 celery.py\n                 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 __init__.py\n                 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings-dev.py\n                 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 settings.py\n                 \xe2\x94\x82\xc2\xa0\xc2\xa0 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 urls.py\n              \xc2\xa0\xc2\xa0 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 wsgi.py\n                 \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 manage.py\n                 \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 media\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是 celery.py :

\n\n
from __future__ import absolute_import, unicode_literals\nimport os\nfrom celery import Celery\nos.environ.setdefault(\'DJANGO_SETTINGS_MODULE\', \'hamclassy.settings\')\n\napp = Celery(\'hamclassy\')\n\napp.config_from_object(\'django.conf:settings\', namespace=\'CELERY\')\napp.autodiscover_tasks()\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是/etc/systemd/system/celery.service:

\n\n
[Unit]\nDescription=Celery Service\nAfter=network.target\n\n[Service]\nType=forking\nUser=classgram\nGroup=www-data\nEnvironmentFile=/etc/conf.d/celery\nWorkingDirectory=/home/classgram/www/hamclassy-backend\nExecStart=/bin/sh -c \'${CELERY_BIN} multi start ${CELERYD_NODES} \\\n  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \\\n  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}\'\nExecStop=/bin/sh -c \'${CELERY_BIN} multi stopwait ${CELERYD_NODES} \\\n  --pidfile=${CELERYD_PID_FILE}\'\nExecReload=/bin/sh -c \'${CELERY_BIN} multi restart ${CELERYD_NODES} \\\n  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \\\n  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}\'\n\n[Install]\nWantedBy=multi-user.target\n\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

和/etc/conf.d/celery:

\n\n
CELERYD_NODES="celery-worker"\n\nCELERY_BIN="/home/classgram/www/env/bin/celery"\n\n# App instance to use\nCELERY_APP="hamclassy"\n\n\nCELERYD_MULTI="multi"\n# Extra command-line arguments to the worker\nCELERYD_OPTS="--time-limit=300 --concurrency=8"\n\n# %n will be replaced with the first part of the nodename.\nCELERYD_LOG_FILE="/var/log/celery/%n%I.log"\nCELERYD_PID_FILE="/var/run/celery/%n.pid"\nCELERYD_LOG_LEVEL="INFO"\n\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我运行服务时systemctl start celery.service出现以下错误:

\n\n
\n

celery.service 的作业失败,因为控制进程退出并显示\n错误代码。有关详细信息,请参阅“systemctl status celery.service”和“journalctl -xe”\n

\n
\n\n

当我运行时sudo journalctl -b -u celery出现以下日志:

\n\n
\n

正在启动 Celery 服务... celery.service:控制进程已退出,\n 代码=已退出状态=200 celery.service:失败,结果为“退出代码”。\n 无法启动 Celery 服务。

\n
\n\n

欲了解更多信息: \n
1)当我使用groups classgram它时,会出现:www-data sudo。\n
2)celery -A hamclassy worker -l info激活环境后我可以很好地运行 Celery 。

\n\n

谢谢

\n

Dej*_*kic 7

好的,现在我们知道错误是什么(根据您的评论),以下几个步骤很可能会解决您的问题:

  1. 为你的 Celery 创建一个虚拟环境:python3 -m venv /home/classgram/venv

  2. 您的环境文件必须为export PYTHONPATH=/home/classgram/www/hamclassy-backend,这是最简单的解决方案,有利于测试和开发。但是,对于生产,我建议您构建一个 Python 包(wheel),并将其安装在虚拟环境中。

  3. 修改你的 systemd 服务文件(也可能是环境文件),以便你可以直接从我们上面创建的 Python 虚拟环境中执行 Celery。它应该以这种方式(或类似的方式)运行 Celery:/home/classgram/venv/bin/celery multi start ${CELERYD_NODES} -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}。当然,您可以通过将 CELERY_BIN 设置为 来缩短它/home/classgram/venv/bin/celery