У меня есть несколько заданий сельдерея, которые выполняются с помощью удара.В процессе разработки я использовал одну команду, чтобы настроить это, например:
celery worker -A my_tasks -n XXXXX@%h -Q for_mytasks -c 1 -E -l INFO -B -s ./config/celerybeat-schedule --pidfile ./config/celerybeat.pid
При переходе в производство я вставил это в скрипт, который активировал мой venv, установил PYTHONPATH, удалил старые файлы ударов, cdисправить каталог, а затем запустить сельдерей.Это работает абсолютно нормально.Однако в производстве я хочу отделить работника от планировщика ритма, например:
celery worker -A my_tasks -n XXXXX@%h -Q for_mytasks -c 1 -E -l INFO -f ./logs/celeryworker.log
celery beat -A my_tasks -s ./config/celerybeat-schedule --pidfile ./config/celerybeat.pid -l INFO -f ./logs/celerybeat.log
Теперь все это прекрасно работает, если включить его в соответствующие сценарии bash.Однако мне нужно, чтобы они запускались при запуске сервера.Я столкнулся с несколькими проблемами:
1) в crontab -e @reboot my_script
не будет работать.Я должен вставить задержку для полного запуска rabbitmq, то есть @reboot sleep 60 && my_script
.Теперь это кажется мне немного «грязным», но я могу с этим смириться.
2) celery worker
требуется несколько секунд, чтобы закончить, прежде чем celery beat
можно будет запустить правильно.Я испробовал всевозможные директивы cron, чтобы выполнить ритм, запускаемый после того, как работник успешно выполнил, но не смог запустить ритм.Мое текущее решение в crontab выглядит примерно так:
@reboot sleep 60 && my_script_worker
@reboot sleep 120 && my_script_beat
Итак, в основном, Ubuntu загружается, ждет 60 секунд и запускает работника сельдерея, а затем ждет еще 60 секунд, прежде чем запустить ритм сельдерея.Это отлично работает, но мне кажется еще более «грязным».В идеальном мире я хотел бы пометить, когда rabbitmq готов к запуску работника, а затем пометить, когда работник выполнил успешно, чтобы я мог запустить бит.
Мой вопрос: кто-нибудь сталкивался с этой проблемой, и если да, тоу них есть более изящный способ начать работу с сельдерея и биться при перезагрузке сервера?
РЕДАКТИРОВАТЬ: 24/09/2019 Благодаря DejanLekic & Greenev
Я потратил несколько часов, чтобы перейти с cron наSystemd.Да, я полностью согласен с тем, что это гораздо более надежное решение.Мой работник и продавец сельдерея теперь запускаются системой как systemd при перезагрузке.
У меня есть один совет для тех, кто пытается это сделать, но он не упомянут в документации по сельдерею.Команда template beat создаст в вашей рабочей директории файл «база данных ритма сельдерея» с именем celerybeat-schedule
.Если вы перезапустите службу ударов, этот файл приведет к появлению ложных заданий сельдерея, которые, по-видимому, не соответствуют вашему фактическому расписанию сельдерея.Решение состоит в том, чтобы удалять этот файл каждый раз, когда запускается служба ритма.Я также удаляю файл pid, если он там есть.Я сделал это, добавив 2 ExecStartPre и опцию -s к службе ударов:
ExecStartPre=/bin/sh -c 'rm -f ${CELERYBEAT_DB_FILE}'
ExecStartPre=/bin/sh -c 'rm -f ${CELERYBEAT_PID_FILE}'
ExecStart=/bin/sh -c '${CELERY_BIN} beat \
-A ${CELERY_APP} --pidfile=${CELERYBEAT_PID_FILE} \
-s ${CELERYBEAT_DB_FILE} \
--logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
Спасибо, ребята.