Celery Daemon не работает на Centos 7

Я пытаюсь запустить демон сельдерея на Centos 7, у которого есть systemd / systemctl. Это не работает.

  • Я попробовал случай без демона, и это сработало
  • Я запустил ~mytask, и он завис на клиентской машине, а на сервере, где работает демон сельдерея, я абсолютно ничего не регистрирую.
  • Я заметил, что на самом деле процессы сельдерея не запущены.

Любые предложения о том, как это исправить?

Вот конфигурация моего демона по умолчанию:

CELERYD_NODES="localhost.localdomain"
CELERY_BIN="/tmp/myapp/venv/bin/celery"
CELERY_APP="pipeline"
CELERYD_OPTS="--broker=amqp://192.168.168.111/"
CELERYD_LOG_LEVEL="INFO"
CELERYD_CHDIR="/tmp/myapp"
CELERYD_USER="root"

Примечание. Я запускаю демон с помощью

sudo /etc/init.d/celeryd start

и я получил свой скрипт демона celery из: https://raw.githubusercontent.com/celery/celery/3.1/extra/generic-init.d/celeryd

Я также попробовал вариант из: https://raw.githubusercontent.com/celery/celery/3.1/extra/generic-init.d/celeryd, но этот показал мне ошибку при попытке запустить демон:

systemd[1]: Starting LSB: celery task worker daemon...
celeryd[19924]: basename: missing operand
celeryd[19924]: Try 'basename --help' for more information.
celeryd[19924]: Starting : /etc/rc.d/init.d/celeryd: line 193: multi: command not found
celeryd[19924]: [FAILED]
systemd[1]: celeryd.service: control process exited, code=exited status=1
systemd[1]: Failed to start LSB: celery task worker daemon.
systemd[1]: Unit celeryd.service entered failed state.

person max    schedule 08.05.2015    source источник


Ответы (2)


celeryd устарел. Если вы можете работать в режиме без демона, скажите

celery worker -l info -A my_app -n my_worker

Вы можете просто демонизировать его, используя celery multi.

celery multi my_worker -A my_app -l info

При этом, если вы все еще хотите использовать celeryd выполните следующие действия.

person ChillarAnand    schedule 09.05.2015
comment
Здорово. Я этого не знал. Знаете ли вы, почему в документе показан пример с celery multi, за которым следуют рабочие команды celery? Я предполагаю, что они сравнивают, и они независимы. Правильный? - person max; 09.05.2015
comment
Я пробовал. Celery multi будет работать, только если вы укажете pidfile и logfile. - person max; 09.05.2015
comment
да, они показывают многократный эквивалент сельдерея рабочих команд. нет необходимости указывать pid, logfile; они необязательны - person ChillarAnand; 09.05.2015

Как уже отвечал @ChillarAnand, не используйте celeryd.

Но на самом деле не так просто, как он написал, запустить celery с celery multi с systemd.

Вот мои рабочие, неочевидные (как мне кажется) примеры.

Они были протестированы на Centos 7.1.1503 с celery 3.1.23 (Cipater), работающим в virtualenv, с примером приложения tasks.py из учебное пособие по сельдерею.

Запуск одного рабочего

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

[Service]
Type=forking
User=vagrant
Group=vagrant

# directory with tasks.py
WorkingDirectory=/home/vagrant/celery_example

# !!! using the below systemd is REQUIRED in this case!
# (you will still get a warning "PID file /var/run/celery/single.pid not readable (yet?) after start." from systemd but service will in fact be starting, stopping and restarting properly. I haven't found a way to get rid of this warning.)
PIDFile=/var/run/celery/single.pid

# !!! using --pidfile option here and below is REQUIRED in this case!
# !!! also: don't use "%n" in pidfile or logfile paths - you will get these files named after the systemd service instead of after the worker (?)
ExecStart=/home/vagrant/celery_example/venv/bin/celery multi start single-worker -A tasks --pidfile=/var/run/celery/single.pid --logfile=/var/log/celery/single.log "-c 4 -Q celery -l INFO"

ExecStop=/home/vagrant/celery_example/venv/bin/celery multi stopwait single-worker --pidfile=/var/run/celery/single.pid --logfile=/var/log/celery/single.log

ExecReload=/home/vagrant/celery_example/venv/bin/celery multi restart single-worker --pidfile=/var/run/celery/single.pid --logfile=/var/log/celery/single.log

# Creates /var/run/celery, if it doesn't exist
RuntimeDirectory=celery

[Install]
WantedBy=multi-user.target

Запуск нескольких рабочих

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

[Service]
Type=forking
User=vagrant
Group=vagrant

# directory with tasks.py
WorkingDirectory=/home/vagrant/celery_example

# !!! in this case DON'T set PIDFile or use --pidfile or --logfile below or it won't work!
ExecStart=/home/vagrant/celery_example/venv/bin/celery multi start 3 -A tasks "-c 4 -Q celery -l INFO"

ExecStop=/home/vagrant/celery_example/venv/bin/celery multi stopwait 3

ExecReload=/home/vagrant/celery_example/venv/bin/celery multi restart 3

# Creates /var/run/celery, if it doesn't exist
RuntimeDirectory=celery

[Install]
WantedBy=multi-user.target

(Обратите внимание, что я запускаю воркеры с -c / --concurrency > 1, но он также работает, если для него установлено значение 1 или значение по умолчанию. Также это должно работать, если вы не будете использовать virtualenv, но я настоятельно рекомендую вам его использовать.)

Я действительно не понимаю, почему systemd не может угадать PID разветвленного процесса в первом случае и почему размещение pid-файлов в определенном месте нарушает второй случай, поэтому я подал заявку здесь: https://github.com/celery/celery/issues/3459 . Если я получу ответы или придумаю какие-то пояснения самостоятельно, то выложу их здесь.

person Greg Dubicki    schedule 22.09.2016
comment
Используйте %%n вместо %n. Дополнительные сведения см. на странице github.com/celery/celery/issues/3459. - person chehsunliu; 22.12.2016
comment
Вы должны добавить строку RuntimeDirectory=celery, чтобы убедиться, что каталог /var/run/celery создается при запуске демона. - person Tim Woocker; 27.06.2017
comment
Спасибо @crey4fun, добавил это к моему ответу. - person Greg Dubicki; 03.01.2018
comment
Но я не использую %n, @Che-HsunLiu...? - person Greg Dubicki; 03.01.2018