2015-03-23 26 views
8

Próbuję uruchomić celerybeat jako demon w Elastic beanstalk. Oto mój plik konfiguracyjny:Daemonize Celerybeat w Elastic Beanstalk (AWS)

files: 
"/opt/python/log/django.log": 
mode: "000666" 
owner: ec2-user 
group: ec2-user 
content: | 
    # Log file 
encoding: plain 
"/opt/elasticbeanstalk/hooks/appdeploy/post/run_supervised_celeryd.sh": 
mode: "000755" 
owner: root 
group: root 
content: | 
    #!/usr/bin/env bash 
    # 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 configuraiton script 
    celeryconf="[program:celeryd] 
    ; Set full path to celery program if using virtualenv 
    command=/opt/python/run/venv/bin/celery worker -A avtotest --loglevel=INFO 

    directory=/opt/python/current/app 
    user=nobody 
    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 = 600 

    ; 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 celerybeat configuraiton script 
    celerybeatconf="[program:celerybeat] 
    ; Set full path to celery program if using virtualenv 
    command=/opt/python/run/venv/bin/celery beat -A avtotest --loglevel=INFO 

    ; remove the -A avtotest argument if you are not using an app instance 

    directory=/opt/python/current/app 
    user=nobody 
    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 = 600 

    ; 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 and beat 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 "[include]" /opt/python/etc/supervisord.conf 
     then 
     echo "[include]" | tee -a /opt/python/etc/supervisord.conf 
     echo "files: celery.conf" | tee -a /opt/python/etc/supervisord.conf 
     echo "files: celerybeat.conf" | 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 

Plik ten demonizuje zarówno seler, jak i seler. Seler działa dobrze. Ale celerybeat nie jest. Nie widzę pliku selverbeat.log, który moim zdaniem sugeruje, że selekcja nie działa.

Wszelkie pomysły na ten temat?

W razie potrzeby opublikuję więcej kodu. Dzięki za pomoc

+1

Czy powinieneś także uruchamiać 'celerybeat' w ostatniej linii skryptu? – pztrick

Odpowiedz

3

Twoja składnia supervisordu jest nieco wyłączona, przede wszystkim możesz potrzebować SSH do swojej instancji i bezpośrednio edytować plik supervisord.conf (vim /opt/python/etc/supervisord.conf), i napraw bezpośrednio tę linię.

echo "[include]" | tee -a /opt/python/etc/supervisord.conf 
echo "files: celery.conf" | tee -a /opt/python/etc/supervisord.conf 
echo "files: celerybeat.conf" | tee -a /opt/python/etc/supervisord.conf 

powinny być

echo "[include]" | tee -a /opt/python/etc/supervisord.conf 
echo "files: celery.conf celerybeat.conf" | tee -a /opt/python/etc/supervisord.conf 

EDIT:

Aby uruchomić celerybeat i upewnij się, że to działa tylko RAZ na wszystkich maszynach, należy umieścić te linie w plikach konfiguracyjnych -

04_killotherbeats: 
    command: "ps auxww | grep 'celery beat' | awk '{print $2}' | sudo xargs kill -9 || true" 
05_restartbeat: 
    command: "supervisorctl -c /opt/python/etc/supervisord.conf restart celerybeat" 
    leader_only: true 
+2

Musiałem również (1) dodać '--pidfile =/tmp/celerybeat.pid' do polecenia Celerybeat w' celerybeat.conf' i (2) dodać 'ignoreErrors: true' do' 04_killotherbeats', aby uzyskać prawidłowe działanie na instancji pracownika Elastic Beanstalk. –

+0

@HakanB. Czy możesz to rozwinąć, ponieważ mój demon selekcji losowo został zabity i odmawia rozpoczęcia cytowania superwizora, którego nie znaleziono? – gauravdott

+0

Wszystko działa dobrze, ale celerybeat jest przygotowywany na każde wystąpienie. Rezultatem jest powielanie zadań okresowych ... –