首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确地用django来守护celerybeat?

如何正确地用django来守护celerybeat?
EN

Stack Overflow用户
提问于 2015-11-23 17:25:36
回答 3查看 1.8K关注 0票数 2

有几个问题类似于这个问题,但没有一个问题有一个正确的解决方案,也没有描述完全相同的问题。

如果我自己从命令行开始执行芹菜,那么定期任务在我的配置中可以很好地工作,如下所示:

代码语言:javascript
复制
celery --app=proj.mycelery worker -B

问题是当我试着去吃芹菜的时候。在遵循本教程之后,我以以下方式启动该服务:

代码语言:javascript
复制
sudo /etc/init.d/celerybeat start

它似乎开始得很好,但是每5秒执行一次的周期性任务并没有发生。

这些是我的芹菜设置在Django的settings.py中:

代码语言:javascript
复制
BROKER_URL = 'amqp://guest:guest@localhost//'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'

这是我的/etc/default/celerybeat配置:

代码语言:javascript
复制
# Absolute or relative path to the 'celery' command:
CELERY_BIN="/home/burzum/.pyenv/versions/old_django/bin/celery"

# App instance to use
CELERY_APP="proj.mycelery"

# Where to chdir at start.
CELERYBEAT_CHDIR="/home/burzum/repos/proj/"

# Extra arguments to celerybeat
CELERYBEAT_OPTS="--schedule=/var/run/celery/celerybeat-schedule"

export DJANGO_SETTINGS_MODULE="proj.settings"

CELERYD_CHDIR="/home/burzum/repos/proj"

/etc/init.d/celerybeat文件与教程(这一个)中的相同。我刚在开头添加了以下一行:

代码语言:javascript
复制
export PYTHONPATH='/home/burzum/repos'

/var/log/celery/beat.log的输出是:

代码语言:javascript
复制
[2015-11-23 09:15:18,304: INFO/MainProcess] beat: Starting...
[2015-11-23 09:15:23,307: INFO/MainProcess] Scheduler: Sending due task reports.tasks.test_periodic_task (reports.tasks.test_periodic_task)
[2015-11-23 09:15:28,310: INFO/MainProcess] Scheduler: Sending due task reports.tasks.test_periodic_task (reports.tasks.test_periodic_task)

所以,看起来这个周期性的任务被调用了,但是什么也没有发生。

sudo /etc/init.d/celerybeat状态的输出为:

代码语言:javascript
复制
celery init v10.1.
Using configuration: , /etc/default/celerybeat
celerybeat (pid 11696) is up...

使用sudo sh -x /etc/init.d/celerybeat 启动服务的输出是:

代码语言:javascript
复制
+ VERSION=10.1
+ export PYTHONPATH=/home/burzum/repos
+ echo celery init v10.1.
celery init v10.1.
+ id -u
+ [ 0 -ne 0 ]
+ [ -L /etc/init.d/celerybeat ]
+ SCRIPT_FILE=/etc/init.d/celerybeat
+ basename /etc/init.d/celerybeat
+ SCRIPT_NAME=celerybeat
+ scripts=
+ test -f /etc/default/celeryd
+ EXTRA_CONFIG=/etc/default/celerybeat
+ test -f /etc/default/celerybeat
+ scripts=, /etc/default/celerybeat
+ _config_sanity /etc/default/celerybeat
+ local path=/etc/default/celerybeat
+ ls -ld /etc/default/celerybeat
+ awk {print $3}
+ local owner=root
+ ls -ld /etc/default/celerybeat+ 
cut -b 6
+ local iwgrp=-
+ ls -ld+  /etc/default/celerybeat
cut -b 9
+ local iwoth=-
+ id -u root
+ [ 0 != 0 ]
+ [ - != - ]
+ [ - != - ]
+ . /etc/default/celerybeat
+ CELERY_BIN=/home/burzum/.pyenv/versions/old_django/bin/celery
+ CELERY_APP=proj.mycelery
+ CELERYBEAT_CHDIR=/home/burzum/repos/proj/
+ CELERYBEAT_OPTS=--schedule=/var/run/celery/celerybeat-schedule
+ export DJANGO_SETTINGS_MODULE=proj.settings
+ CELERYD_CHDIR=/home/burzum/repos/proj
+ echo Using configuration: , /etc/default/celerybeat
Using configuration: , /etc/default/celerybeat
+ CELERY_BIN=/home/burzum/.pyenv/versions/old_django/bin/celery
+ DEFAULT_USER=celery
+ DEFAULT_PID_FILE=/var/run/celery/beat.pid
+ DEFAULT_LOG_FILE=/var/log/celery/beat.log
+ DEFAULT_LOG_LEVEL=INFO
+ DEFAULT_CELERYBEAT=/home/burzum/.pyenv/versions/old_django/bin/celery beat
+ CELERYBEAT=/home/burzum/.pyenv/versions/old_django/bin/celery beat
+ CELERYBEAT_LOG_LEVEL=INFO
+ CELERY_APP_ARG=
+ [ ! -z proj.mycelery ]
+ CELERY_APP_ARG=--app=proj.mycelery
+ CELERYBEAT_USER=celery
+ CELERY_CREATE_DIRS=0
+ CELERY_CREATE_RUNDIR=0
+ CELERY_CREATE_LOGDIR=0
+ [ -z  ]
+ CELERYBEAT_PID_FILE=/var/run/celery/beat.pid
+ CELERY_CREATE_RUNDIR=1
+ [ -z  ]
+ CELERYBEAT_LOG_FILE=/var/log/celery/beat.log
+ CELERY_CREATE_LOGDIR=1
+ export CELERY_LOADER
+ CELERYBEAT_OPTS=--schedule=/var/run/celery/celerybeat-schedule -f /var/log/celery/beat.log -l INFO
+ [ -n  ]
+ dirname /var/log/celery/beat.log
+ CELERYBEAT_LOG_DIR=/var/log/celery
+ dirname /var/run/celery/beat.pid
+ CELERYBEAT_PID_DIR=/var/run/celery
+ CELERYBEAT_CHDIR=/home/burzum/repos/proj/
+ [ -n /home/burzum/repos/proj/ ]
+ DAEMON_OPTS= --workdir=/home/burzum/repos/proj/
+ export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/sbin:/sbin
+ check_dev_null
+ [ ! -c /dev/null ]
+ check_paths
+ [ 1 -eq 1 ]
+ create_default_dir /var/log/celery
+ [ ! -d /var/log/celery ]
+ [ 1 -eq 1 ]
+ create_default_dir /var/run/celery
+ [ ! -d /var/run/celery ]
+ start_beat
+ echo Starting celerybeat...
Starting celerybeat...
+ _chuid --app=proj.mycelery --schedule=/var/run/celery/celerybeat-schedule -f /var/log/celery/beat.log -l INFO --workdir=/home/burzum/repos/proj/ --detach --pidfile=/var/run/celery/beat.pid
+ su celery -c /home/burzum/.pyenv/versions/old_django/bin/celery beat --app=proj.mycelery --schedule=/var/run/celery/celerybeat-schedule -f /var/log/celery/beat.log -l INFO --workdir=/home/burzum/repos/proj/ --detach --pidfile=/var/run/celery/beat.pid
+ exit 0
EN

回答 3

Stack Overflow用户

发布于 2019-01-29 14:57:48

最后,这是一个有用的例子。

  1. 制作celery_service.conf
  2. 制作celery.service

例如,使用Centos systemctl运行服务。就是这样。

我添加了有用的脚本:

票数 1
EN

Stack Overflow用户

发布于 2018-03-03 21:16:33

我对此也没有正确的答案,我也阅读了一些复制和粘贴相同的教程:

注-B用于开发目的。对于生产环境,你需要分别开始芹菜拍打。

没有人真正展示如何实现这一目标的活生生的例子。我想选择

CELERYD_NODES=“拍子”

会成功的,但不管用。因此,只有在您的"celeryd“配置中添加选项-B或- beat,才能使这个单独的工作人员真正处于beat状态。

“--scheduler=django_celery_beat.schedulers:DatabaseScheduler”“--击败CELERYD_OPTS=

UPD:我发现,这是一个文档问题,在这里描述:https://github.com/celery/celery/issues/4304

在这里,您可以看到通过systemd正确实现beat的一个例子:https://specialistoff.net/question/238

我已经检查过了

票数 0
EN

Stack Overflow用户

发布于 2019-01-29 15:07:48

我想您有一个带有systemd的linux服务器。使用systemd,而不是“泛型init-脚本”。

系统d有文档,但它们低于旧的init.d方式:

http://docs.celeryproject.org/en/master/userguide/daemonizing.html#usage-systemd

引用文档的话:

这是一个示例systemd文件: /etc/systemd/system/celery.service:

代码语言:javascript
复制
[Unit]
Description=Celery Service
After=network.target

[Service]
Type=forking
User=celery
Group=celery
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/opt/celery
ExecStart=/bin/sh -c '${CELERY_BIN} multi start ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait ${CELERYD_NODES} \
  --pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart ${CELERYD_NODES} \
  -A ${CELERY_APP} --pidfile=${CELERYD_PID_FILE} \
  --logfile=${CELERYD_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL} ${CELERYD_OPTS}'

[Install]
WantedBy=multi-user.target
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33876932

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档