Supervisor не загружает новые файлы конфигурации


68

У меня проблема с развертыванием приложения Django с использованием Gunicorn и Supervisor. Хотя я могу сделать так, чтобы Gunicorn обслуживал мое приложение (установив правильный PYTHONPATH и выполнив соответствующую команду, например, из конфигурации supervisord), я не могу заставить supervisor запускать его. Он просто не увидит мое приложение. Я не знаю, как убедиться, что файл конфигурации в порядке.

Вот что говорит supervisorctl:

# supervisorctl start myapp_live
myapp_live: ERROR (no such process)

Я запускаю его на Ubuntu 10.04 со следующим конфигом:

Файл /home/myapp/live/deploy/supervisord_live.ini:

[program:myapp_live]
command=/usr/local/bin/gunicorn_django --log-file /home/myapp/logs/gunicorn_live.log --log-level info --workers 2 -t 120 -b 127.0.0.1:10000 -p deploy/gunicorn_live.pid webapp/settings_live.py
directory=/home/myapp/live
environment=PYTHONPATH='/home/myapp/live/eco/lib'
user=myapp
autostart=true
autorestart=true

В /etc/supervisor/supervisord.conf в конце файла находится:

[include]
files = /etc/supervisor/conf.d/*.conf

и вот символическая ссылка на мой конфигурационный файл:

# ls -la /etc/supervisor/conf.d
lrwxrwxrwx 1 root root   48 Dec  4 18:02 myapp-live.conf -> /home/myapp/live/deploy/supervisord_live.ini

все выглядит хорошо для меня, но supervisorctl просто продолжаю говорить myapp_live: ERROR (no such process). Любое решение для этого?


Я чесал голову с той же проблемой; мои файлы конфигурации не загружались при запуске rereadили update. Оказалось , что я скопил свои конфигурационные файлы , как foo.conf.pyвместо того , foo.confчтобы они не были идентифицированы.
— Тимми О'Махони

Ответы:


31

У меня была такая же проблема,

sudo service supervisord reload

сделал свое дело, хотя я не знаю, если это ответ на ваш вопрос.


2
Я остановился, а затем начал наблюдателя некоторое время назад, и это сработало. Не знаю, сработает ли перезагрузка (как у меня перезапуск сердца нет), но я думаю, что это могло бы быть
— grucha

Я тоже это сделал, и это сработало. Интересно, почему /etc/init.d/supervisor restartне работает, когда ручную остановку и начало делай.
— Кирилл

1
Работал для меня, хотя служба не работала, поэтому я просто побежал, ps aux | grep supervisorа затемsudo kill -HUP pid
— Уэйн Вернер

2
Это опасно, поскольку перезапустит весь демон supervisor.
— Марк Теуниссен

7
Перечитанный supervisorctl может исправить это, не перезапуская сервис.
— Джонатан Люти

199

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

supervisorctl reread
supervisorctl update

13
Это должен быть правильный ответ. «Перечитать супервизора» одного недостаточно.
— Мибстер

3
+1 Это лучший ответ, потому что он не зависит от менеджеров процессов.
— Tidwall

8
Одного «supervisorctl reread» недостаточно, но разве «supervisorctl update» не достаточно? Согласно документации, «обновление» выполняет перечитывание с последующим перезапуском любых программ, конфигурация которых была изменена при перечитывании.
— BlueBomber

Это работает для меня. Я сделал перезагрузку позже.
— user1012513

15

Убедитесь, что ваши файлы conf supervisor заканчиваются на .conf

Мне понадобилось время, чтобы понять это. Надеюсь, это поможет следующему человеку.


1
Потратил час на одну и ту же проблему - не могу поверить, что это было так просто.
— Зейн Хупер

1
Спасибо за перечисление этого ответа. Что касается жизни, я не мог понять это.
— Филипп Мартин

14

Перезагрузка главного процесса супервизора может сработать, но у него будут непредвиденные побочные эффекты, если супервизор контролирует более одного процесса.

Правильный способ сделать это - выполнить команду, supervisorctl rereadкоторая заставляет его сканировать файлы конфигурации на наличие изменений:

root@debian:~# supervisorctl reread
gunicorn: changed

Затем просто перезагрузите это приложение:

root@debian:~# supervisorctl restart gunicorn
gunicorn: stopped
gunicorn: started

Это лучшее решение, если вы хотите только прочитать измененный / новый файл конфигурации и оставить остальные запущенные процессы без изменений. Supervisorctl покажет новое приложение avail. Добавьте его в (пере) запускаемые процессы, выполнив supervisorctl update. См. Также ответ Марка serverfault.com/a/479754/125887
— Сяак Трехаак

4
Это было недостаточно для меня. supervisorctl updateбыло необходимо.
— Ярослав Никитенко

5

Я столкнулся с этой проблемой, используя пакет supervisor, версия 3.0a8-1.1 из Ubuntu Server 12.10. Я решил проблему, прочитав встроенную справку:

$ sudo supervisorctl help restart
restart <name>          Restart a process
restart <gname>:*       Restart all processes in a group
restart <name> <name>   Restart multiple processes or groups
restart all             Restart all processes

В частности, вы хотите использовать синтаксис:

sudo supervisorctl restart myapp_live:*

Как указано в документации по адресу: http://supervisord.org/configuration.html#programx-section - «Раздел [program: x] фактически представляет« однородную группу процессов »для супервизора (начиная с версии 3.0)». Так что, возможно, проблема впервые появилась в версии 3.0.

PS: я новичок в супервизоре; Я использую https://github.com/bdarnell/tornado-production-skeleton/blob/8ad055457646929c0e8f48aaf20d98f054b1787b/production/chat.supervisor в качестве примера того, как должна выглядеть минимальная конфигурация.


4

У меня была похожая проблема ( myapp_live: ERROR (no such process)), и это потому, что мое определение процесса было

[program: myapp_live]

когда это должно было быть

[program:myapp_live]

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


Тоже самое! Я оставил это как [program]только, следуя документам, но заставляя это заставить [program:redis]это работать для меня. Вещи, конечно, становятся странными время от времени!
— ankush981

2

Я нашел это решение наиболее удобным:

РЕДАКТИРОВАТЬ: перед этим проверьте ваш путь supervisorctl с помощью, which supervisorctlчтобы убедиться, что вы добавляете правильный путь к sudoers.

Добавьте эту строку в файл sudoers, используя visudo(где: myappuser- пользователь, которому нужно перезапустить ваше приложение, myapp- имя приложения):

myappuser  ALL=(ALL) NOPASSWD: /usr/bin/supervisorctl restart myapp

А потом просто:

sudo supervisorctl restart myapp

Вы не привязаны к сценариям запуска дистрибутива и даете пользователю довольно узкие права на перезапуск вашего приложения gunicorn. Кроме того, вам не нужно заботиться о pid. Команда не запрашивает пароль, поэтому она подходит для сценариев bash / fabric с автоматическим развертыванием. С другой стороны - вы должны знать, что если supervisorctl уязвим к некоторой ошибке, вызывающей выполнение кода, злоумышленник может использовать эту привилегию sudo для запуска кода от имени пользователя root (но, насколько я знаю, такой ошибки не было обнаружено для supervisord и найти такую ​​уязвимость очень важно).


2

Читая код supervisorctl.py здесь: https://github.com/Supervisor/supervisor/blob/master/supervisor/supervisorctl.py

Вы можете видеть, что обновление supervisorctl (функция do_update) вызывает reloadConfig () точно так же, как и повторное чтение supervisorctl (функция do_reread).

Поэтому я думаю, что повторное чтение вызова не нужно, если вы вызываете обновление после него.

По результатам мерзавца, это было так, по крайней мере, с июля 2009 года.


2

Вот контрольный список:

  1. Новый файл конфигурации должен быть назван в соответствии с шаблоном включения, настроенным в /etc/supervisord.conf:

    [include]
    files=supervisord.d/*.ini
    

    Как мы видим в моем случае, spam.ini будет включен, а spam.conf - нет.

  2. Если вы создали новый файл, скопировав старый, обязательно измените [program:]строку. Потому что, если вы настолько глупы, как наличие двух файлов для одной и той же программы, supervisorctl rereadвы получите это безнадежное сообщение об ошибке в качестве наказания:

    No config updates to processes
    
  3. Если ваш файл обнаружен, supervisorctl rereadследует сказать что-то вроде:

    spam: available
    
  4. Затем supervisorctl update spamследует запустить его и сделать так, чтобы он появился в supervisorctl status.


1

Я обнаружил, что сценарии init.d ненадежны в различных версиях Ubuntu / Debian. Способ сделать это так:

sudo supervisorctl reload

Это не правильный способ сделать это, хотя это будет работать при многих обстоятельствах. @ burhan-khalid ответ правильный и дает объяснения.
— Гларрейн

1

Будьте осторожны с символическими ссылками и включайте файлы в Supervisor. Это позволило бы любому человеку с привилегией w на /home/myapp/live/deploy/supervisord_live.ini изменить INI-файл и запустить любой вредоносный код. Эти INI-файлы должны находиться в каталоге conf вашего супервизора или в любом его подкаталоге.


0

Я установил supervisrod с помощью yum install, который установил супервизор версии v2. *. Supervisor поддерживает внешние включения только из версии 3. Пришлось использовать easy_install вместо этого, чтобы установить supervisor v3.


Это также было моей проблемой, вероятно, это будет происходить на всех установках Centos 6.5 или менее.
— Bearrito
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.