【Django,Celery,Ubuntu】バックグラウンドでタスクの永続化の手順(メモ)

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

参考文献

タイトルとURLをコピーしました