{{tag>service unix linux python supervisor initd}}

====== Supervisor by python ======

  * http://supervisord.org

Служит для демонизации процессов/программ с определенными параметрами и отслеживания их состояния. Запуск процессов supervisord производит от своего имени, как под процессы, поэтому контроль остается за визором. Supervisorctl предоставляет системный- и веб-интерфейсы для мониторинга и управления процессами. Вы можете предоставить пользователям доступ на определенные программы, а они в свою очередь смогут видеть состояние этих программ и совершать действия над ними (start, stop, restart). Также имеется XML-RPC интерфейс, которым вы можете пользоваться для написания своих расширений и приложений, которым нужен доступ к Supervisord.
Supervisor написан на [[develop:python:python]].
===== Установка =====

==== apt-get ====


  $ sudo apt-get install supervisor

==== pip ====

Можно установить еще и c помощью пакетного мененджера pip для [[develop:python:python]], самая свежая версия из питоновского  установщика, но для этого нужно еще тянуть кучу пакетов для питона и компиляторов

  sudo pip install --upgrade supervisor
  sudo ln -s /usr/local/bin/supervisord /usr/bin/supervisord
  sudo ln -s /usr/local/etc/supervisord.conf /etc/supervisord.conf

===== Настройка =====

  nano /etc/supervisor/supervisor.conf
или
  $ echo_supervisord_conf > /etc/supervisor/supervisor.conf

  [unix_http_server]
  file = /tmp/supervisor.sock
  
  [supervisord]
  logfile          = ./logs/supervisord.log
  logfile_maxbytes = 50MB
  logfile_backups  = 10
  loglevel         = info
  pidfile          = /tmp/supervisord.pid
  nodaemon         = false
  minfds           = 1024
  minprocs         = 200
  
  [rpcinterface:supervisor]
  supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
  
  [supervisorctl]
  serverurl = unix:///tmp/supervisor.sock
  
  [program:someprogram1]
  command                 = bash -c "ulimit -n 10000; exec /usr/bin/php ./bin/some-program-1.php"
  process_name            = Some-Program
  numprocs                = 1
  autostart               = true
  autorestart             = true
  user                    = root
  stdout_logfile          = ./logs/some-program-info.log
  stdout_logfile_maxbytes = 1MB
  stderr_logfile          = ./logs/some-program-error.log
  stderr_logfile_maxbytes = 1MB

===== WEB GUI =====

Для запуска web интерфейса supervisorctl необходимо в файле /etc/supervisor/supervisord.conf проверить наличие секции:
  [inet_http_server]
  port=127.0.0.1:9771
  ;username=user
  ;password=123


Для работы через nginx c web версией можно написать прокси сервер:

  server {
      listen 80;
      server_name supervisor.loc;
      location / {
          proxy_pass http://127.0.0.1:9771;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      }
  }

после чего перезапускаем nginx с supervisor' ом:


  /etc/init.d/supervisor restart
  /etc/init.d/nginx restart
Если при запуске supervisor возникла ошибка: Starting supervisor: Error: Another program is already listening on a port that one of our HTTP..., то для решения данной проблемы нужно убить socket supervisor.sock, где находится видно из конфига

Пример:

  $sudo unlink /tmp/supervisor.sock
Далее из браузера заходим на http://supervisor.loc

===== supervisorctl =====

Создание задач для supervisor:\\
Для создания задач, необходимо прописывать конфиги в /etc/supervisor/conf.d/ Структура файла конфигураций для worker'а supervisor'а:


  [program:]
  command=
  process_name=%(process_num)s                          
  stdout_logfile=/var/log/.log
  stderr_logfile=/var/log/.log
  redirect_stderr=true
  autostart=true                                         
  autorestart=true                                       
  startsecs=5                                            
  numprocs=1   

  * [program:] — заголовок секции. Нижеследующие параметры будут относится только к этому воркеру(демону)
  * command — команда на запуск файла. чаще всего путь к исполняемому файлу.
  * process_name — имя каждого инстанса воркера. Здесь есть тонкость — В мануале указано, что этот параметр не обязательный. Но у меня были проблемы с запуском нескольких инстансов воркера, если его не указывать. Дело в том, что имена процессов должны отличаться. Здесь помимо названия воркера указываем его порядковый номер.
  * stdout_logfile — говорит само за себя. куда перенаправляем стандартную консоль вывода.
  * stderr_logfile — то же самое, только для ошибок. Рекомендую указывать эти 2 параметра. Они могут очень выручить, когда придется разбераться почему падают ваши демоны.
  * autostart — как и следовало ожидать. запускаем воркеров при запуске супервизорда. Как правило при старте системы.
  * autorestart — Перазапуск воркера, если тот при выполнении одного из заданий упал с Exception'ом.
  * startsecs — сколько времени нужно ждать воркера, чтобы он запустился (не обязательный параметр)
  * numprocs — количество инстансов воркеров.

===== Наблюдения =====

Иногда при останове supervisor'а остается висеть на порту http сервера python - нужно найти кто висит

  sudo netstat -nap | grep 9771
И грохнуть по pid процесс:

  sudo kill 2342
Прописать параметры $_SERVER в конфиге supervisor можно через переменную environment:

  [program:php-test]
  command=php /path/file.php
  environment=HTTP_HOST="blog-tree.com",SOME_SERVER_PARAM="my_param"
далее нам эти переменные будут доступны из $_SERVER['HTTP_HOST'] и $_SERVER['SOME_SERVER_PARAM']

{{topic>[python]}}