Запускаем celery как демон (daemon), альтернатива свойству detach.
Основательная статья по Celery на Flask.
Чуть более развернуто об управлении systemd/systemctl.
Создаем сервис для worker
Создаем файл:
Вставляем содержимое:
Description=Celery Service
# rabbitmq.target | redis.target
After=network.target rabbitmq.target
[Service]
Type=forking
User=root
Group=www-data
EnvironmentFile=-/etc/systemd/celery.conf
WorkingDirectory=/home/ploshadka/ploshadka.net/
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p ${CELERYD_STATE_DIR}
ExecStartPre=/bin/chown -R ${CELERYD_USER}:${CELERYD_GROUP} ${CELERYD_STATE_DIR}
ExecStart=/bin/sh -c '${CELERY_BIN} multi start \
${CELERYD_NODES} \
-A ${CELERY_APP} \
--pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} \
--loglevel=${CELERYD_LOG_LEVEL} \
${CELERYD_OPTS}'
ExecStop=/bin/sh -c '${CELERY_BIN} multi stopwait \
${CELERYD_NODES} \
--pidfile=${CELERYD_PID_FILE}'
ExecReload=/bin/sh -c '${CELERY_BIN} multi restart \
${CELERYD_NODES} \
-A ${CELERY_APP} \
--pidfile=${CELERYD_PID_FILE} \
--logfile=${CELERYD_LOG_FILE} \
--loglevel=${CELERYD_LOG_LEVEL} \
${CELERYD_OPTS}'
[Install]
WantedBy=multi-user.target
Запускаем от пользователя root, чтобы избежать проблем с доступами к папкам логов и т.д.
Из содержимого вверху надо поменять только WorkingDirectory на свою.
Создаем сервис для beat
Создаем файл для демона celerybeat:
Содержимое:
Description=CeleryBeat Service
# rabbitmq.target | redis.target
After=network.target rabbitmq.target
[Service]
Type=simple
User=root
Group=www-data
EnvironmentFile=-/etc/systemd/celery.conf
WorkingDirectory=/home/ploshadka/ploshadka.net/
PermissionsStartOnly=true
ExecStartPre=-/bin/mkdir -p ${CELERYBEAT_STATE_DIR}
ExecStartPre=/bin/chown -R ${CELERYD_USER}:${CELERYD_GROUP} ${CELERYBEAT_STATE_DIR}
# ExecStartPre=/bin/rm ${CELERYBEAT_SCHEDULE}
ExecStart=/bin/bash -c '${CELERY_BIN} beat \
-A ${CELERY_APP} \
--workdir=${CELERYBEAT_WORKDIR} \
--pidfile=${CELERYBEAT_PID_FILE} \
--logfile=${CELERYBEAT_LOG_FILE} \
--loglevel=${CELERYBEAT_LOG_LEVEL} \
--schedule=${CELERYBEAT_SCHEDULE}'
ExecStop=/bin/systemctl kill celerybeat.service
[Install]
WantedBy=multi-user.target
Создаем конфиг для сервисов выше
Файл конфигурации для обоих сервисов будет единым. В нем мы опишем настройки как для worker так и для celerybeat.
Создаем файл:
Вставляем туда:
CELERYD_USER="root"
CELERYD_GROUP="www-data"
# Path to directory and task
CELERY_BIN="/home/ploshadka/ploshadka.net/venv/bin/celery"
CELERY_APP="tasks.monitoring.celery"
# Worker settings
CELERYD_NODES="worker1"
CELERYD_OPTS=" --purge"
CELERYD_MULTI="multi"
CELERYD_STATE_DIR="/var/run/celery"
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n.log"
# Beat settings
CELERYBEAT_STATE_DIR="/var/run/celerybeat"
CELERYBEAT_PID_FILE="/var/run/celerybeat/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"
CELERYBEAT_SCHEDULE="/var/run/celerybeat/schedule"
CELERYBEAT_WORKDIR="/home/ploshadka/ploshadka.net/"
# INFO / DEBUG / etc
CELERYD_LOG_LEVEL="INFO"
CELERYBEAT_LOG_LEVEL="INFO"
Теперь запускаем сервис:
sudo systemctl enable celerybeat.service
Или запускаем и добавляем его в автозагрузку:
sudo systemctl enable --now celerybeat.service
Перезапустить после правки файлов:
sudo systemctl restart celery.service
sudo systemctl restart celerybeat.service
Проверить статус:
sudo systemctl status celerybeat.service
Остановить:
sudo systemctl stop celerybeat.service