ExternalInvocationError
Насколько я понимаю, это означает, что указанная команда не может быть запущена из команд контейнера EB. Нужно создать скрипт на сервере и запустить сельдерей из скрипта. Этот пост описывает, как это сделать.
Обновление:
Необходимо создать файл конфигурации в каталоге .ebextensions
. Я назвал это celery.config
. Ссылка на пост выше предоставляет скрипт, который работает почти нормально. Нужно сделать некоторые незначительные дополнения для работы на 100% правильно. У меня были проблемы с расписанием периодических заданий ( сельдерей, бит ). Ниже приведены инструкции по исправлению:
Установить (добавить к требованиям) django-celery beat pip install django-celery-beat
, добавить его в установленные приложения и использовать параметр --scheduler
при запуске сельдерея. Инструкции здесь .
В скрипте вы указываете пользователя, который запускает скрипт. Для сельдерея это celery
пользователь, который был добавлен ранее в сценарий (если не существует). Когда я попытался запустить ритм сельдерея, я получил ошибку PermissionDenied . Это означает, что пользователь celery не имеет всех необходимых прав. используя ssh, я вошел в EB, посмотрел список всех пользователей (cat /etc/passwd
) и решил использовать daemon user.
Перечисленные шаги разрешают ошибки удара сельдерея. Обновленный конфигурационный файл со скриптом находится ниже (celery.config):
`` `
файлы:
"/Opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh":
режим: "000755"
владелец: root
группа: корень
содержание: |
#! / usr / bin / env bash
# Create required directories
sudo mkdir -p /var/log/celery/
sudo mkdir -p /var/run/celery/
# Create group called 'celery'
sudo groupadd -f celery
# add the user 'celery' if it doesn't exist and add it to the group with same name
id -u celery &>/dev/null || sudo useradd -g celery celery
# add permissions to the celery user for r+w to the folders just created
sudo chown -R celery:celery /var/log/celery/
sudo chown -R celery:celery /var/run/celery/
# Get django environment variables
celeryenv=`cat /opt/python/current/env | tr '\n' ',' | sed 's/%/%%/g' | sed 's/export //g' | sed 's/$PATH/%(ENV_PATH)s/g' | sed 's/$PYTHONPATH//g' | sed 's/$LD_LIBRARY_PATH//g'`
celeryenv=${celeryenv%?}
# Create CELERY configuration script
celeryconf="[program:celeryd]
directory=/opt/python/current/app
; Set full path to celery program if using virtualenv
command=/opt/python/run/venv/bin/celery worker -A config.celery:app --loglevel=INFO --logfile=\"/var/log/celery/%%n%%I.log\" --pidfile=\"/var/run/celery/%%n.pid\"
user=celery
numprocs=1
stdout_logfile=/var/log/celery-worker.log
stderr_logfile=/var/log/celery-worker.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 60
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=998
environment=$celeryenv"
# Create CELERY BEAT configuraiton script
celerybeatconf="[program:celerybeat]
; Set full path to celery program if using virtualenv
command=/opt/python/run/venv/bin/celery beat -A config.celery:app --loglevel=INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler --logfile=\"/var/log/celery/celery-beat.log\" --pidfile=\"/var/run/celery/celery-beat.pid\"
directory=/opt/python/current/app
user=daemon
numprocs=1
stdout_logfile=/var/log/celerybeat.log
stderr_logfile=/var/log/celerybeat.log
autostart=true
autorestart=true
startsecs=10
; Need to wait for currently executing tasks to finish at shutdown.
; Increase this if you have very long running tasks.
stopwaitsecs = 60
; When resorting to send SIGKILL to the program to terminate it
; send SIGKILL to its whole process group instead,
; taking care of its children as well.
killasgroup=true
; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=999
environment=$celeryenv"
# Create the celery supervisord conf script
echo "$celeryconf" | tee /opt/python/etc/celery.conf
echo "$celerybeatconf" | tee /opt/python/etc/celerybeat.conf
# Add configuration script to supervisord conf (if not there already)
if ! grep -Fxq "celery.conf" /opt/python/etc/supervisord.conf
then
echo "[include]" | tee -a /opt/python/etc/supervisord.conf
echo "files: uwsgi.conf celery.conf celerybeat.conf" | tee -a /opt/python/etc/supervisord.conf
fi
# Enable supervisor to listen for HTTP/XML-RPC requests.
# supervisorctl will use XML-RPC to communicate with supervisord over port 9001.
# Source: https://askubuntu.com/questions/911994/supervisorctl-3-3-1-http-localhost9001-refused-connection
if ! grep -Fxq "[inet_http_server]" /opt/python/etc/supervisord.conf
then
echo "[inet_http_server]" | tee -a /opt/python/etc/supervisord.conf
echo "port = 127.0.0.1:9001" | tee -a /opt/python/etc/supervisord.conf
fi
# Reread the supervisord config
supervisorctl -c /opt/python/etc/supervisord.conf reread
# Update supervisord in cache without restarting all services
supervisorctl -c /opt/python/etc/supervisord.conf update
# Start/Restart celeryd through supervisord
supervisorctl -c /opt/python/etc/supervisord.conf restart celeryd
supervisorctl -c /opt/python/etc/supervisord.conf restart celerybeat
команды:
01_killotherbeats:
команда: "ps auxww | grep 'celery beat' | awk '{print $ 2}' | sudo xargs kill -9 || true"
ignoreErrors: true
02_restartbeat:
команда: "supervisorctl -c /opt/python/etc/supervisord.conf перезапустить celerybeat"
leader_only: правда
`` `
Одна вещь, на которую нужно обратить внимание: в моем проекте файл celery.py
находится в каталоге config
, поэтому я пишу -A config.celery:app
при запуске работник сельдерея и удар сельдерея