5

我在重新构建和重新开始cookiecutter-django docker-compose生产时遇到了这个问题。我可以通过删除所有停止的docker 容器或添加rm -f './celerybeat.pid'类似于/compose/production/django/celery/beat/start.sh. /compose/local/django/celery/beat/start.sh是否有任何理由不在撰写文件的生产版本中包含此特定代码?

4

5 回答 5

1

请看这里:

禁用 celerybeat 的 pidfile

您可以指定不带任何位置的 pidfile,这样每次 celery 启动时都会重新创建它

--pidfile=
于 2019-11-23T18:24:43.070 回答
1

之前有一篇关于如何通过在运行命令中将 PID 文件设置为空值来解决此问题的帖子,但解决方案并不完整,我花了一点点试错来让它在我的生产系统上运行,所以我想我会发布一个docker-compose文件,该文件具有一个beats服务,该服务使用命令运行以celerybeats.pid在启动时创建一个新文件。

作为说明,我正在使用django-celery-beathttps ://pypi.org/project/django-celery-beat/

version: '3'

services:

  redis:
    image: redis
    restart: unless-stopped
    ports:
      - "6379"

  beats:
    build: .
    user: user1
    # note the --pidfile= in this command
    command: celery --pidfile= -A YOURPROJECT beat -l info --scheduler django_celery_beat.schedulers:DatabaseScheduler
    env_file: ./.env.prod
    restart: unless-stopped
    volumes:
      - .:/code
      - tmp:/tmp
    links:
      - redis
    depends_on:
      - redis

volumes:
  tmp:

这样做我不再收到ERROR: Pidfile (celerybeat.pid) already exists错误,并且我不必运行rm命令。

于 2020-06-24T13:34:58.137 回答
0

您可以使用celery worker --pidfile=/path/to/celeryd.pid指定未安装的路径,使其不在主机上的镜像。

于 2018-11-28T16:27:30.350 回答
0

如果您可以不使用beat,则 celery 可以通过传入 'B' 标志来处理周期性任务。执行此操作时,不会生成 .pid 文件,而是生成一个celerybeat-schedule文件。当你重新运行 celery 时,它不会抱怨重用这个文件。就源代码控制而言,只需将其添加到您的 .gitignore 即可。

这是完整形式的命令:

celery -A <appname> worker -l info -BE

于 2019-03-23T00:09:12.400 回答
0

其他方式,创建一个 django 命令 celery_kill.py

import shlex
import subprocess

from django.core.management.base import BaseCommand


class Command(BaseCommand):
    def handle(self, *args, **options):
        kill_worker_cmd = 'pkill -9 celery'
        subprocess.call(shlex.split(kill_worker_cmd))

码头工人-compose.yml :

celery:
    build: ./src
    restart: always
    command: celery -A project worker -l info
    volumes:
      - ./src:/var/lib/celery/data/
    depends_on:
      - db
      - redis
      - app

  celery-beat:
    build: ./src
    restart: always
    command: celery -A project beat -l info --pidfile=/tmp/celeryd.pid
    volumes:
      - ./src:/var/lib/beat/data/
    depends_on:
      - db
      - redis
      - app

和生成文件:

run:
    docker-compose up -d --force-recreate
    docker-compose exec app python manage.py celery_kill
    docker-compose restart
    docker-compose exec app python manage.py migrate
于 2019-03-22T21:26:33.933 回答