【问题标题】:ERROR: Pidfile (celerybeat.pid) already exists错误:Pidfile (celerybeat.pid) 已经存在
【发布时间】:2018-05-17 01:09:56
【问题描述】:

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

【问题讨论】:

  • 嗨。我面临同样的问题。你有没有想出另一种方法来做到这一点?还是您只是坚持使用rm ...

标签: django cookiecutter-django


【解决方案1】:

请看这里:

Disable pidfile for celerybeat

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

--pidfile=

【讨论】:

    【解决方案2】:

    之前有一篇关于如何通过在运行命令中将 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 命令。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        其他方式,创建一个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
        

        【讨论】:

          【解决方案5】:

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

          这是完整的命令:

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

          【讨论】:

          • 嵌入式 Beat 选项:-B、--beat 同时运行 celery beat 定期任务调度程序。请注意此服务必须只有一个实例。 .. 注意:: -B 用于开发目的。 对于生产环境,您需要分别开始芹菜节拍。来自celery worker --help
          猜你喜欢
          • 2021-10-04
          • 1970-01-01
          • 1970-01-01
          • 2015-11-24
          • 2020-08-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-06-13
          相关资源
          最近更新 更多