Djangoでバックグラウンドで定期的にタスクを実行したのでメモしておきます。
(個人用のメモです)
環境
- ubuntu 18.04
手順
まずsupervisorをインストールします。
sudo apt-get install supervisor
supervisorの設定の記述
# sudo vim /etc/supervisor/conf.d/project-celery.conf [program:project-celery] command=/home/you/project/venv/bin/celery -A project worker -B -l info directory=/home/you/project/ user=root numprocs=1 stdout_logfile=/home/you/project/logs/celery.log stderr_logfile=/home/you/project/logs/celery.log autostart=true autorestart=true startsecs=10 stopwaitsecs = 600 stopasgroup=true priority=1000
supervisorを更新します。
sudo supervisorctl reread sudo supervisorctl update
celeryやdjangoでceleryを動かすためのツールをいくつかインストールします。
pip install redis pip install celery pip install django-celery-results pip install django-redis pip install django-celery-beat
settings.pyを編集します。
celeryはredisで動かしますのceleryの設定も書いていきます。
# settings.py INSTALLED_APPS = [ ・ ・ ・ 'django_celery_beat', 'django_celery_results', ] # CELERY STUFF BROKER_URL = 'redis://localhost:6379' CELERY_RESULT_BACKEND = 'redis://localhost:6379' CELERY_ACCEPT_CONTENT = ['application/json'] CELERY_TASK_SERIALIZER = 'json' CELERY_RESULT_SERIALIZER = 'json' CELERY_TIMEZONE = 'Asia/Tokyo' CELERYBEAT_SCHEDULE = { 'your_task': { 'task': 'tasks.test_task', # project/tasks.pyのtest_taskという関数 'schedule': timedelta(seconds=20), 'args': [argument] # 変数 }, }
celery.pyを作成し編集します。
# project/celery.py from __future__ import absolute_import import os from celery import Celery from django.conf import settings os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'project.settings') app = Celery('project') app.config_from_object('django.conf:settings') app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
定期的に実行するタスクを定義します。
# project/tasks.py from __future__ import absolute_import, unicode_literals from celery import shared_task @shared_task def test_task(arg1): print(arg1)
redisを起動します。
systemctl start redis-server.service
redisを起動した後にceleryを動かします。
sudo supervisorctl start project-celery
これでバックグラウンドで動いているはずです。
うまくいかなかった場合
confのbind先を変更します。
詳しくは以下のサイトを参照
https://www.ubuntu-perl-web.com/blog/20200225174004.html
sudo cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sudo vi /etc/redis/redis.conf
で、
bind 127.0.0.1 ::1をbind 127.0.0.1 に変更
その後に
systemctl start redis-server.service