Перезапустите Gunicorn_django через Fabric

Я создаю приложение Django и решил изучить Fabric для автоматизации развертывания. У меня это в основном работает, но на последнем этапе происходит сбой, и я не могу понять, почему.

Я использую Nginx и Gunicorn для обслуживания приложения, и я хочу убить и перезапустить Gunicorn после внесения изменений и обновления базы данных. К сожалению, всегда кажется, что он терпит неудачу на последнем препятствии.

Последняя команда не отвечает с какой-либо ошибкой, но приложение не обслуживается, и если я использую SSH, для него нет процесса, и мне приходится перезапускать его вручную. Любая другая команда работает отлично.

Мой сказочный файл.py:

#!/usr/bin/env python
from fabric.api import local, env, run
from fabric.context_managers import cd, prefix

env.hosts = ['192.168.1.1']
env.path = "/home/matthew/Sites/projectname"


def deploy():
    # Push changes to Bitbucket
    local('git push origin master')

    # Switch to project directory
    with cd(env.path):
        # Pull changes to server
        run('git pull origin master')

        # Activate virtualenv
        with prefix('source venv/bin/activate'):

            # Collect static files
            run('python manage.py collectstatic --noinput')

            # Sync and migrate the database
            run('python manage.py syncdb')
            run('python manage.py migrate')

            # Kill and restart Gunicorn
            run('killall gunicorn_django || true')
            run('gunicorn_django -D -c gunicorn.conf.py')

Если я сбрасываю флаг -D, чтобы он не демонизировался, он работает, и я получаю следующий вывод, но мне нужно отключиться вручную с помощью Ctrl-C. Если я добавлю & в конец, это перестанет работать:

[192.168.1.1] out: 2013-05-22 12:47:51 [60549] [INFO] Starting gunicorn 0.17.4
[192.168.1.1] out: 2013-05-22 12:47:51 [60549] [INFO] Listening at: http://127.0.0.1:8888 (60549)
[192.168.1.1] out: 2013-05-22 12:47:51 [60549] [INFO] Using worker: sync
[192.168.1.1] out: 2013-05-22 12:47:51 [60554] [INFO] Booting worker with pid: 60554
[192.168.1.1] out: 2013-05-22 12:47:51 [60555] [INFO] Booting worker with pid: 60555
[192.168.1.1] out: 2013-05-22 12:47:51 [60556] [INFO] Booting worker with pid: 60556
[192.168.1.1] out: 

Может ли кто-нибудь увидеть, где я сбился с пути?


person Matthew Daly    schedule 22.05.2013    source источник
comment
Когда вы запускаете его вручную, вы делаете это из виртуальной среды? Кроме того, что вы получите, если наберете which guinicon_django? Возможно, место не в PATH.   -  person Burhan Khalid    schedule 22.05.2013
comment
Я установил Gunicorn в виртуальную среду, и когда я запускаю ее вручную через SSH, я уже активировал виртуальную среду.   -  person Matthew Daly    schedule 22.05.2013
comment
Путь выглядит правильным — это /home/matthew/Sites/projectname/venv/bin/gunicorn_django, а gunicorn_django находится в каталоге venv/bin/.   -  person Matthew Daly    schedule 22.05.2013
comment
Вы пытались запустить его, не демонизируя его (-D), чтобы получить результат? Возможно, вы используете разные учетные записи пользователей для запуска вручную или через ткань?   -  person AJJ    schedule 22.05.2013
comment
@AJJ Я только что попробовал, и это работает. Единственным недостатком является то, что он остается подключенным, и мне приходится использовать Ctrl-C для отключения. Я вставлю вывод в тело вопроса.   -  person Matthew Daly    schedule 22.05.2013
comment
Попробуйте вставить его в фоновом режиме с помощью & и посмотрите, поможет ли это; или запрет на использование чего-то вроде supervisor или circus.   -  person Burhan Khalid    schedule 22.05.2013
comment
@BurhanKhalid Уже попробовал, и это останавливает его работу. Теперь это работает в некоторой степени, но я посмотрю на супервизора.   -  person Matthew Daly    schedule 22.05.2013


Ответы (2)


Никогда не решал эту проблему как таковую, но в конце концов сдался и взял Supervisor. Как оказалось, Supervisor довольно прост в использовании, и благодаря этому блогу post Я довольно быстро разобрался. Просто подумал, что опубликую это на тот случай, если у кого-то еще возникнет такая же проблема и он наткнется на эту страницу.

person Matthew Daly    schedule 12.06.2013

Я тоже столкнулся с этой проблемой. Я подождал несколько секунд между уничтожением и перезапуском процесса пушки, и пока он работает нормально.

kill_running_gunicorn_process()
time.sleep(10)
start_gunicorn_process()
person Akshar Raaj    schedule 16.12.2013