Как добавить задания 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'