Как добавить задания Cron из нескольких приложений Django в Crontab без конфликтов?

У меня есть два приложения Django, которые я запускаю на Amazon Linux с помощью Gunicorn. Каждое Django-приложение имеет свои собственные задания cron, определенные в файле settings.py с помощью django_crontab. Однако при попытке добавить задания cron из обоих приложений в crontab я сталкиваюсь с проблемами.

Вот структура моих приложений:

Приложение 1

/path/to/app1/
├── manage.py
├── app1/
│   ├── settings.py
│   └── ...

Приложение 2

/path/to/app2/
├── manage.py
├── app2/
│   ├── settings.py
│   └── ...

В файле settings.py каждого приложения я определил задания cron следующим образом:

# app1/settings.py
CRONJOBS = [
    ('*/10 * * * *', 'app1.cron.my_scheduled_task'),
]

# app2/settings.py
CRONJOBS = [
    ('*/15 * * * *', 'app2.cron.another_scheduled_task'),
]

Когда я пытаюсь добавить задания cron для каждого приложения с помощью следующих команд:

cd /path/to/app1
source /path/to/venv/bin/activate
python manage.py crontab add

cd /path/to/app2
source /path/to/venv/bin/activate
python manage.py crontab add


Когда я выполняю python manage.py crontab add для второго приложения, я получаю ошибку

RuntimeError: No job with hash 65f37180992aa5435pidg617281f3e6 found. It seems the crontab is out of sync with your settings.CRONJOBS. Run "python manage.py crontab add" again to resolve this issue!

Этот хэш-идентификатор соответствует заданию из первого приложения.

Как добавить задания cron из обоих приложений в кронтаб, чтобы они не конфликтовали?

Что я пробовал: Убедиться, что у каждого приложения есть собственное виртуальное окружение. Запуск python manage.py crontab add в каталоге каждого приложения.

Желаемый результат: Я хочу иметь возможность добавлять в кронтаб задания cron из обоих приложений, не сталкиваясь с конфликтами хэш-идентификаторов.

В операторы задания можно передавать необязательный параметр. Это позволяет передавать уникальный идентификатор для каждого проекта, каждого задания.

# app1/settings.py
CRONJOBS = [
    ('*/10 * * * *', 'app1.cron.my_scheduled_task', 'my_project_one_job1'),
    ('*/10 * * * *', 'app1.cron.my_scheduled_task2', 'my_project_one_job2'),
]

# app2/settings.py
CRONJOBS = [
    ('*/15 * * * *', 'app2.cron.another_scheduled_task', 'my_project_two_job1'),
    ('*/15 * * * *', 'app2.cron.another_scheduled_task2', 'my_project_two_job2'),
]

Здесь в документации они называют это 'optional: a job specific suffix'

Вернуться на верх