невозможно запустить гуникорн с тканью

Мой код лежит в /home/ubuntu/api на удаленном сервере. Объект WSGI называется app и присутствует в /home/ubuntu/api/api.py. Мой файл конфигурации gunicorn называется gunicorn.conf.py и присутствует в /home/ubuntu/api

my gunicorn.conf.py

import multiprocessing

bind = "127.0.0.1:8000"
workers = multiprocessing.cpu_count() * 2 + 1
backlog = 2048
worker_class = 'gevent'
daemon = True
debug = True
loglevel = 'debug'
accesslog = '/mnt/log/gunicorn_access.log'
errorlog = '/mnt/log/gunicorn_error.log'
max_requests = 1000
graceful_timeout = 20

Я пытаюсь запустить gunicorn на сервере удаленно через ткань. Мой код ткани выглядит так

@roles('stag_api')
def run_server():
    with cd('/home/ubuntu/api'):
        sudo('gunicorn -c gunicorn.conf.py api:app')

Теперь ткань не показывает никаких ошибок, но ганикорн не запускается.

Поэтому я создал __init__.py в /home/ubuntu/api, чтобы сделать его пакетом. Я написал это в файле __init__.py

from api import app

Это делает WSGI app доступным в пространстве имен пакета. Затем я изменил свой код ткани на этот

@roles('stag_api')
def run_server():
    sudo('gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app')

Даже сейчас ткань не показывает никакой ошибки, но ганикорн не запускается.

Итак, я создал сценарий оболочки с именем server, и его код выглядит так:

if [ "$1" = "start" ]; then
        echo 'starting'
        gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app
fi

if [ "$1" = "stop" ]; then
        echo 'stopping'
        pkill gunicorn
fi

if [ "$1" = "restart" ]; then
        echo 'restarting'
        pkill gunicorn
        gunicorn -c /home/ubuntu/api/gunicorn.conf.py api:app
fi

Я помещаю этот сценарий оболочки в /home/ubuntu/api

Теперь мой код ткани выглядит так

@roles('stag_api')
def stag_server(action='restart'):
    if action not in ['start', 'stop', 'restart']:
        print 'not a valid action. valid actions are start, stop and restart'
        return
    sudo('./server %s' % action)

Теперь, когда я пытаюсь запустить сервер через ткань, он печатает starting, поэтому сценарий оболочки выполняется, и блок if достигается, но я все еще не могу запустить сервер через ткань.

Но если я подключаюсь к серверу по ssh и делаю sudo ./server start, запускается пушка.

Может кто-нибудь объяснить, что я делаю неправильно?


person lovesh    schedule 19.07.2013    source источник
comment
предоставьте журналы ошибок, пожалуйста   -  person Artem Mezhenin    schedule 24.07.2013
comment
@amezhenin ошибки нет. просто не запускается ганикорн   -  person lovesh    schedule 25.07.2013
comment
ты понял это?   -  person Rafael Barros    schedule 01.08.2013
comment
У вас есть решение, я в такой же ситуации, и использование pyt=False также не работает.   -  person Arun    schedule 15.07.2014


Ответы (2)


Скорее всего, это связано с этими двумя пунктами часто задаваемых вопросов:

http://www.fabfile.org/faq.html#init-scripts-don-t-work

http://www.fabfile.org/faq.html#why-can-ti-run-programs-in-the-background-with-it-makes-fabric-hang

person Morgan    schedule 01.08.2013
comment
Обратите внимание, что ответы, содержащие только ссылки, не приветствуются (ссылки имеют тенденцию со временем ломаться). Пожалуйста, отредактируйте свой ответ и добавьте краткий обзор здесь. - person bummi; 02.08.2013
comment
Спасибо. добавление pty=False работает. Поэтому я изменил свой код на sudo('./server %s' % action, pty=False), и теперь он может успешно запускать Guncorn. Пожалуйста, сделайте свой ответ немного более описательным. - person lovesh; 08.08.2013
comment
@lovesh спасибо! Ссылки в исходном ответе больше не работают. Самое близкое, что я нашел, это docs.fabfile.org/en/1.7/usage. /interactivity.html, но не обсуждается в контексте сценариев инициализации или фоновых процессов. - person Eric Mill; 16.09.2014
comment
Исправлены ссылки, по какой-то причине они были перемещены из docs.fabfile.org. Извините за путаницу. - person Morgan; 16.09.2014

Попробуйте глобально установить pty False с помощью:

from fabric.api import env

env.always_use_pty = False

Или установите pty False для этой команды с помощью:

run('run unicorn command etc...' pty=False)

См. раздел сценария инициализации в:

http://www.fabfile.org/faq.html#init-scripts-don-t-work

person juan Isaza    schedule 26.06.2017