Это старая версия документа!


Supervisor

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

$ sudo apt-get install supervisor

Можно установить еще и так, самая свежая версия из питоновского установщика, но для этого нужно еще тянуть кучу пакетов для питона и компиляторов

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

Для запуска 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, и видим, что-то такое: (если есть созданные задачи)

Создание задач для supervisor:<br> Для создания задач, необходимо прописывать конфиги в /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']