Spec-Zone.ru › Celery

Запуск в режиме демона

В большинстве современных дистрибутивов Linux для управления жизненным циклом системных и пользовательских служб используется systemd.

Проверить, использует ли ваш дистрибутив Linux systemd, можно, введя:

$ systemctl--version
systemd 249 (v249.9-1.fc35)
+PAM +AUDIT +SELINUX -APPARMOR +IMA +SMACK +SECCOMP +GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified

Если вы получили вывод, похожий на приведённый выше, обратитесь к нашей документации по systemd.

Однако скрипт init.d также должен работать в таких дистрибутивах Linux, поскольку systemd предоставляет слой совместимости systemd-sysv, который автоматически создаёт службы на основе предоставляемых нами скриптов init.d.

Если вы упаковываете Celery для нескольких дистрибутивов Linux, и некоторые из них не поддерживают systemd, или для других Unix-систем, обратитесь к нашей документации по init.d.

См. каталог extra/generic-init.d/ в дистрибутиве Celery.

В этом каталоге находятся универсальные bash-скрипты init для программы celery worker. Они должны работать в Linux, FreeBSD, OpenBSD и других Unix-подобных системах.

Использование:

/etc/init.d/celeryd {start|stop|restart|status}

Файл конфигурации:

/etc/default/celeryd

Чтобы настроить этот скрипт для правильного запуска worker, вам, вероятно, как минимум нужно указать, в какой каталог переходить при запуске (чтобы найти модуль с вашим приложением или модуль конфигурации).

Скрипт запуска демона настраивается с помощью файла /etc/default/celeryd. Это shell-скрипт (sh), в который можно добавить переменные окружения, например параметры конфигурации ниже. Чтобы добавить переменные окружения, влияющие на работу worker, необходимо также экспортировать их (например, export DISPLAY=":0")

Требуются привилегии суперпользователя

Скрипты init можно использовать только от имени root, и файл конфигурации shell также должен принадлежать root.

Пользователям без привилегий не нужно использовать скрипт init: вместо этого они могут воспользоваться утилитой celery multi (или celery worker --detach):

$ celery-Aprojmultistartworker1\
--pidfile="$HOME/run/celery/%n.pid"\
--logfile="$HOME/log/celery/%n%I.log"

$ celery-Aprojmultirestartworker1\
--logfile="$HOME/log/celery/%n%I.log"\
--pidfile="$HOME/run/celery/%n.pid

$ celerymultistopwaitworker1--pidfile="$HOME/run/celery/%n.pid"

Пример конфигурации для проекта Python.

/etc/default/celeryd:

# Names of nodes to start
#   most people will only start one node:
CELERYD_NODES="worker1"
#   but you can also start multiple and configure settings
#   for each in CELERYD_OPTS
#CELERYD_NODES="worker1 worker2 worker3"
#   alternatively, you can specify the number of nodes to start:
#CELERYD_NODES=10

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
#CELERY_BIN="/virtualenvs/def/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="proj"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# Where to chdir at start.
CELERYD_CHDIR="/opt/Myproject/"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"
# Configure node-specific settings by appending node name to arguments:
#CELERYD_OPTS="--time-limit=300 -c 8 -c:worker2 4 -c:worker3 2 -Ofair:worker1"

# Set logging level to DEBUG
#CELERYD_LOG_LEVEL="DEBUG"

# %n will be replaced with the first part of the nodename.
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_PID_FILE="/var/run/celery/%n.pid"

# Workers should run as an unprivileged user.
#   You need to create this user manually (or you can choose
#   a user/group combination that already exists (e.g., nobody).
CELERYD_USER="celery"
CELERYD_GROUP="celery"

# If enabled pid and log directories will be created if missing,
# and owned by the userid/group configured.
CELERY_CREATE_DIRS=1

Можно унаследовать окружение CELERYD_USER, используя оболочку входа:

CELERYD_SU_ARGS="-l"

Обратите внимание: этот вариант не рекомендуется и его следует использовать только при крайней необходимости.

Пользователи Django теперь используют тот же шаблон, что и выше, но убедитесь, что модуль, в котором объявлен экземпляр приложения Celery, также задаёт значение по умолчанию для DJANGO_SETTINGS_MODULE, как показано в примере проекта Django в разделе Первые шаги с Django.

  • CELERY_APP

    Используемый экземпляр приложения (значение для аргумента --app).

  • CELERY_BIN

    Абсолютный или относительный путь к программе celery. Примеры:

    • celery

    • /usr/local/bin/celery

    • /virtualenvs/proj/bin/celery

    • /virtualenvs/proj/bin/python -m celery

  • CELERYD_NODES

    Список имён узлов для запуска (разделённых пробелами).

  • CELERYD_OPTS

    Дополнительные аргументы командной строки для worker. Список аргументов см. в celery worker –help. Также поддерживается расширенный синтаксис, используемый multi для настройки отдельных узлов. Примеры настройки нескольких узлов см. в celery multi –help.

  • CELERYD_CHDIR

    Каталог, в который нужно перейти при запуске. По умолчанию используется текущий каталог.

  • CELERYD_PID_FILE

    Полный путь к файлу PID. По умолчанию используется /var/run/celery/%n.pid

  • CELERYD_LOG_FILE

    Полный путь к файлу журнала worker. По умолчанию используется /var/log/celery/%n%I.log Примечание: При использовании пула prefork важно применять %I, поскольку несколько процессов, записывающих данные в один файл журнала, могут вызвать состояние гонки.

  • CELERYD_LOG_LEVEL

    Уровень журналирования worker. По умолчанию — INFO.

  • CELERYD_USER

    Пользователь, от имени которого запускается worker. По умолчанию — текущий пользователь.

  • CELERYD_GROUP

    Группа, от имени которой запускается worker. По умолчанию — текущий пользователь.

  • CELERY_CREATE_DIRS

    Всегда создавать каталоги (для журнала и файла PID). По умолчанию каталоги создаются только в том случае, если не заданы пользовательские пути к файлу журнала или файлу PID.

  • CELERY_CREATE_RUNDIR

    Всегда создавать каталог для файла PID. По умолчанию этот параметр включён только в том случае, если не задан пользовательский путь к файлу PID.

  • CELERY_CREATE_LOGDIR

    Всегда создавать каталог для файла журнала. По умолчанию этот параметр включён только в том случае, если не задан пользовательский путь к файлу журнала.

Использование:

/etc/init.d/celerybeat {start|stop|restart}

Файл конфигурации:

/etc/default/celerybeat или /etc/default/celeryd.

Пример конфигурации для проекта Python:

/etc/default/celerybeat:

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
#CELERY_BIN="/virtualenvs/def/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="proj"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# Where to chdir at start.
CELERYBEAT_CHDIR="/opt/Myproject/"

# Extra arguments to celerybeat
CELERYBEAT_OPTS="--schedule=/var/run/celery/celerybeat-schedule"

Используйте тот же шаблон, что и выше, но убедитесь, что переменная DJANGO_SETTINGS_MODULE задана (и экспортирована), а CELERYD_CHDIR указывает на каталог проекта:

exportDJANGO_SETTINGS_MODULE="settings"

CELERYD_CHDIR="/opt/MyProject"
  • CELERY_APP

    Используемый экземпляр приложения (значение для аргумента --app).

  • CELERYBEAT_OPTS

    Дополнительные аргументы для celery beat. Список доступных параметров см. в celery beat --help.

  • CELERYBEAT_PID_FILE

    Полный путь к файлу PID. По умолчанию используется /var/run/celeryd.pid.

  • CELERYBEAT_LOG_FILE

    Полный путь к файлу журнала. По умолчанию используется /var/log/celeryd.log.

  • CELERYBEAT_LOG_LEVEL

    Используемый уровень журналирования. По умолчанию — INFO.

  • CELERYBEAT_USER

    Пользователь, от имени которого запускается beat. По умолчанию — текущий пользователь.

  • CELERYBEAT_GROUP

    Группа, от имени которой запускается beat. По умолчанию — текущий пользователь.

  • CELERY_CREATE_DIRS

    Всегда создавать каталоги (для журнала и файла PID). По умолчанию каталоги создаются только в том случае, если не заданы пользовательские пути к файлу журнала или файлу PID.

  • CELERY_CREATE_RUNDIR

    Всегда создавать каталог для файла PID. По умолчанию этот параметр включён только в том случае, если не задан пользовательский путь к файлу PID.

  • CELERY_CREATE_LOGDIR

    Всегда создавать каталог для файла журнала. По умолчанию этот параметр включён только в том случае, если не задан пользовательский путь к файлу журнала.

Если скрипты init не удаётся запустить, попробуйте выполнить их в подробном режиме:

# sh-x/etc/init.d/celerydstart

Это может помочь выяснить, почему служба не запускается.

Если worker запускается с сообщением «OK», но почти сразу завершает работу и в файле журнала нет никаких сведений, вероятно, произошла ошибка. Однако стандартные потоки вывода демона уже закрыты, поэтому увидеть её не получится. В этом случае можно использовать переменную окружения C_FAKEFORK, чтобы пропустить этап запуска демона:

# C_FAKEFORK=1sh-x/etc/init.d/celerydstart

Теперь вы сможете увидеть сообщения об ошибках.

Обычно такие ошибки возникают из-за недостаточных прав на чтение или запись в файл, а также из-за синтаксических ошибок в модулях конфигурации, модулях пользователя, сторонних библиотеках или даже в самом Celery (если вы обнаружили ошибку, сообщите о ней).

  • extra/systemd/

Использование:

systemctl {start|stop|restart|status} celery.service

Файл конфигурации:

/etc/conf.d/celery

Пример файла systemd:

/etc/systemd/system/celery.service:

[Unit]
Description=CeleryService
After=network.target

[Service]
Type=forking
User=celery
Group=celery
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/opt/celery
ExecStart=/bin/sh-c'${CELERY_BIN} -A $CELERY_APP multi start $CELERYD_NODES \
    --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} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}"'
ExecReload=/bin/sh-c'${CELERY_BIN} -A $CELERY_APP multi restart $CELERYD_NODES \
    --pidfile=${CELERYD_PID_FILE} --logfile=${CELERYD_LOG_FILE} \
    --loglevel="${CELERYD_LOG_LEVEL}" $CELERYD_OPTS'
Restart=always

[Install]
WantedBy=multi-user.target

После размещения этого файла в /etc/systemd/system выполните команду systemctl daemon-reload, чтобы Systemd обнаружил этот файл. Эту команду также нужно выполнять каждый раз после изменения файла. Выполните systemctl enable celery.service, если хотите, чтобы служба celery запускалась автоматически при загрузке или перезагрузке системы.

При необходимости можно указать дополнительные зависимости для службы celery: например, если в качестве брокера используется RabbitMQ, можно указать rabbitmq-server.service и в After=, и в Requires= в разделе [Unit] systemd.

Чтобы настроить пользователя, группу и каталог chdir, укажите параметры User, Group и WorkingDirectory в файле /etc/systemd/system/celery.service.

Для создания рабочих каталогов (для журналов и PID) также можно использовать systemd-tmpfiles.

файл:

/etc/tmpfiles.d/celery.conf

d/run/celery0755celerycelery-
d/var/log/celery0755celerycelery-

Пример конфигурации для проекта Python:

/etc/conf.d/celery:

# Name of nodes to start
# here we have a single node
CELERYD_NODES="w1"
# or we could have three nodes:
#CELERYD_NODES="w1 w2 w3"

# Absolute or relative path to the 'celery' command:
CELERY_BIN="/usr/local/bin/celery"
#CELERY_BIN="/virtualenvs/def/bin/celery"

# App instance to use
# comment out this line if you don't use an app
CELERY_APP="proj"
# or fully qualified:
#CELERY_APP="proj.tasks:app"

# How to call manage.py
CELERYD_MULTI="multi"

# Extra command-line arguments to the worker
CELERYD_OPTS="--time-limit=300 --concurrency=8"

# - %n will be replaced with the first part of the nodename.
# - %I will be replaced with the current child process index
#   and is important when using the prefork pool to avoid race conditions.
CELERYD_PID_FILE="/var/run/celery/%n.pid"
CELERYD_LOG_FILE="/var/log/celery/%n%I.log"
CELERYD_LOG_LEVEL="INFO"

# you may wish to add these options for Celery Beat
CELERYBEAT_PID_FILE="/var/run/celery/beat.pid"
CELERYBEAT_LOG_FILE="/var/log/celery/beat.log"

Пример файла systemd для Celery Beat:

/etc/systemd/system/celerybeat.service:

[Unit]
Description=CeleryBeatService
After=network.target

[Service]
Type=simple
User=celery
Group=celery
EnvironmentFile=/etc/conf.d/celery
WorkingDirectory=/opt/celery
ExecStart=/bin/sh-c'${CELERY_BIN} -A ${CELERY_APP} beat  \
    --pidfile=${CELERYBEAT_PID_FILE} \
    --logfile=${CELERYBEAT_LOG_FILE} --loglevel=${CELERYD_LOG_LEVEL}'
Restart=always

[Install]
WantedBy=multi-user.target

После размещения этого файла в /etc/systemd/system выполните команду systemctl daemon-reload, чтобы Systemd обнаружил этот файл. Эту команду также нужно выполнять каждый раз после изменения файла. Выполните systemctl enable celerybeat.service, если хотите, чтобы служба celery beat запускалась автоматически при загрузке или перезагрузке системы.

Запуск worker с привилегиями суперпользователя — крайне опасная практика. Всегда следует искать способ избежать запуска от имени root. Celery может выполнять произвольный код из сообщений, сериализованных с помощью pickle. Это опасно, особенно при запуске от имени root.

По умолчанию Celery не запускает worker от имени root. Соответствующее сообщение об ошибке может быть не видно в журналах, но его можно увидеть, если использовать C_FAKEFORK.

Чтобы принудительно запускать worker от имени root, используйте C_FORCE_ROOT.

При запуске от имени root без C_FORCE_ROOT worker отобразит сообщение «OK», но сразу же завершит работу без видимых ошибок. Эта проблема может возникнуть, если проект (непреднамеренно) запускается от имени root в новой среде разработки или рабочей среде.

https://pypi.org/project/supervisor/

  • extra/supervisord/

  • extra/macOS

Copyright © 2017-2026 Asif Saif Uddin, core team & contributors. All rights reserved.
Celery is licensed under The BSD License (3 Clause, also known as the new BSD license). The license is an OSI approved Open Source license and is GPL-compatible.
https://docs.celeryq.dev/en/stable/userguide/daemonizing.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API