Назад | Перейти на главную страницу

Изящное завершение работы сельдерея с помощью systemd?

У меня есть коробка с сельдереем, некоторые из которых выполняют достаточно длительные задачи (несколько минут). Когда это поле обновится, я хотел бы изящно отключить рабочих сельдерея, чтобы в идеале:

  1. Новые задачи перестают отправляться работникам
  2. Существующие задачи разрешено завершать (с некоторым таймаутом)
  3. Рабочие, наконец, убиты, и новые рабочие начали

Я использую systemd для управления службами в моем Ubuntu. Вот мой файл conf:

[Unit]
Description=Celery Service
After=network.target

[Service]
User=celery
Type=forking
WorkingDirectory=/var/app/celery/
ExecStart=/var/app/celery/run_celery.sh
ExecStop=/var/app/celery/stop_celery.sh
Nice=1
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Скрипт run_celery.sh содержит (вкратце):

celery multi start 2 -A my_app --pidfile=/tmp/celery-%n.pid

И stop_celery.sh содержит:

celery multi stopwait 2 --pidfile=/tmp/celery-%n.pid

Однако, когда я останавливаю скрипт с помощью systemctl, задачи убиваются, а не позволяют рабочим закончить. Что я делаю не так?

Вы, вероятно, захотите установить TimeoutStopSec= на то, что вы хотите, чтобы был тайм-аут. Увидеть systemd.service справочную страницу для получения более подробной информации.