错误:Pidfile(celerybeat.pid)已经存在

时间:2018-05-17 01:09:56

标签: django cookiecutter-django

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

5 个答案:

答案 0 :(得分:1)

之前有一篇有关如何通过在run命令中将PID文件设置为空值来解决此问题的文章,但解决方案尚未完成,花了我一点点的反复试验才能使其在我的生产中正常工作系统,所以我想发布一个 docker-compose 文件,该文件具有 beats 服务,该服务通过命令运行,以在创建新celerybeats.pid文件时运行开始。

请注意,我使用的是 django-celery-beat https://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命令。

答案 1 :(得分:0)

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

答案 2 :(得分: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))

docker-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

和Makefile:

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

答案 3 :(得分:0)

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

以下是完整格式的命令:

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

答案 4 :(得分:0)

请在这里看看

Disable pidfile for celerybeat

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

--pidfile=