Supervisor — демон, который управляет процессами в системе, позволяет отслеживать их состояние, в случаи непредвиденного выхода — перезапускать. Особая популярность применения как правило связана с внешними скриптами, которые необходимо запускать по определенным правилам и отслеживать их состояние. Например, с статье Gearman: распределяем задачи мы используем воркеты, их стоит поместить в окружение Supervisor.
Кроме демона система оснащена веб-интерфейсом и консольной утилитой supervisorctl: для мониторинга и управления процессами .
Установка supervisor.
Как правило пакет «supervisor» присутствует в системных репозитариях, однако стоит обратить внимание на версию. В связи с развитием проекта, на момент написания статьи, нас интересует 3 версия. К сожалению CentOS ставит вторую версию пакета, по этому перед выполнением команд следуют убедиться, что пакет не установлен или если установлен и версия ниже 3-й — удалить.
Непосредственно установка:
#yum install python-setuptools
#easy_install supervisor
# supervisord --version
3.1.3 |
#yum install python-setuptools
#easy_install supervisor
# supervisord --version
3.1.3
Easy Install не создает нам конфигурационный файл и файл запуска демона:
Исправим это недоразумение.
echo_supervisord_conf > /etc/supervisord.conf |
echo_supervisord_conf > /etc/supervisord.conf
В конфигурационном файле снимаем комментарий с «[include]»:
[include]
files = /etc/supervisord.d/*.conf |
[include]
files = /etc/supervisord.d/*.conf
Скрипт запуска помещаем в /etc/rc.d/init.d/supervisord:
#!/bin/bash
. /etc/init.d/functions
DAEMON=/usr/bin/supervisord
PIDFILE=/var/run/supervisord.pid
[ -x "$DAEMON" ] || exit 0
start() {
echo -n "Starting supervisord: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo supervisord already running: $PID
exit 2;
else
daemon $DAEMON --pidfile=$PIDFILE -c /etc/supervisord.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
return $RETVAL
fi
}
stop() {
echo -n "Shutting down supervisord: "
echo
killproc -p $PIDFILE supervisord
echo
rm -f /var/lock/subsys/supervisord
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status supervisord
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $? |
#!/bin/bash
. /etc/init.d/functions
DAEMON=/usr/bin/supervisord
PIDFILE=/var/run/supervisord.pid
[ -x "$DAEMON" ] || exit 0
start() {
echo -n "Starting supervisord: "
if [ -f $PIDFILE ]; then
PID=`cat $PIDFILE`
echo supervisord already running: $PID
exit 2;
else
daemon $DAEMON --pidfile=$PIDFILE -c /etc/supervisord.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
return $RETVAL
fi
}
stop() {
echo -n "Shutting down supervisord: "
echo
killproc -p $PIDFILE supervisord
echo
rm -f /var/lock/subsys/supervisord
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status supervisord
;;
restart)
stop
start
;;
*)
echo "Usage: {start|stop|status|restart}"
exit 1
;;
esac
exit $?
Не забываем выдать права на запуск:
chmod 755 /etc/rc.d/init.d/supervisord |
chmod 755 /etc/rc.d/init.d/supervisord
Применение на практике:
В папке /etc/supervisor/conf.d создаем необходимое нам задание на запуск.
Одиночное:
[program:gearman_client]
command=/usr/bin/php gearman_client.php
directory=/mnt/vhosts/httpdocs/
autostart=true
autorestart=true |
[program:gearman_client]
command=/usr/bin/php gearman_client.php
directory=/mnt/vhosts/httpdocs/
autostart=true
autorestart=true
Или несколько потоков:
[program:yii-gearman-worker]
command=/usr/bin/php /yii/yii gearman/start %(process_num)s
directory=/mnt/vhosts/httpdocs/
process_name=gearman-worker-%(process_num)s
priority=1
numprocs=3
numprocs_start=1
autorestart=true |
[program:yii-gearman-worker]
command=/usr/bin/php /yii/yii gearman/start %(process_num)s
directory=/mnt/vhosts/httpdocs/
process_name=gearman-worker-%(process_num)s
priority=1
numprocs=3
numprocs_start=1
autorestart=true
Проверяем что все работает:
# ps -ax| grep php
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
11943 ? S 0:00 /usr/bin/php /mnt/vhosts/httpdocs/include/cron/gearman_client.php
12167 ? S 0:13 /usr/bin/php /home/vhosts/yii/yii gearman/start 1
12168 ? S 0:13 /usr/bin/php /home/vhosts/yii/yii gearman/start 3
12170 ? S 0:12 /usr/bin/php /home/vhosts/yii/yii gearman/start 2
16443 pts/3 S+ 0:00 grep php |
# ps -ax| grep php
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
11943 ? S 0:00 /usr/bin/php /mnt/vhosts/httpdocs/include/cron/gearman_client.php
12167 ? S 0:13 /usr/bin/php /home/vhosts/yii/yii gearman/start 1
12168 ? S 0:13 /usr/bin/php /home/vhosts/yii/yii gearman/start 3
12170 ? S 0:12 /usr/bin/php /home/vhosts/yii/yii gearman/start 2
16443 pts/3 S+ 0:00 grep php