我在重新构建和重新开始cookiecutter-django
docker-compose
生产时遇到了这个问题。我可以通过删除所有停止的docker 容器或添加rm -f './celerybeat.pid'
类似于/compose/production/django/celery/beat/start.sh
. /compose/local/django/celery/beat/start.sh
是否有任何理由不在撰写文件的生产版本中包含此特定代码?
5 回答
之前有一篇关于如何通过在运行命令中将 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
命令。
您可以使用celery worker --pidfile=/path/to/celeryd.pid
指定未安装的路径,使其不在主机上的镜像。
如果您可以不使用beat
,则 celery 可以通过传入 'B' 标志来处理周期性任务。执行此操作时,不会生成 .pid 文件,而是生成一个celerybeat-schedule
文件。当你重新运行 celery 时,它不会抱怨重用这个文件。就源代码控制而言,只需将其添加到您的 .gitignore 即可。
这是完整形式的命令:
celery -A <appname> worker -l info -BE
其他方式,创建一个 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