Управляем процессами с Supervisor

2015-11-13 14-24-25 home — 127.0.0.1 3388 — Подключение к удаленному рабочему столу

Supervisor — демон, который управляет процессами  в системе, позволяет отслеживать их состояние, в случаи непредвиденного выхода — перезапускать. Особая популярность применения как правило связана с внешними скриптами, которые необходимо запускать по определенным правилам и отслеживать их состояние. Например, с статье Gearman: распределяем задачи мы используем воркеты, их стоит поместить в окружение Supervisor.

Кроме демона система оснащена веб-интерфейсом и консольной утилитой supervisorctl: для мониторинга и управления процессами .

Установка supervisor.

Как правило пакет «supervisor» присутствует в системных репозитариях, однако стоит обратить внимание на версию. В связи с развитием проекта, на момент написания статьи, нас интересует 3 версия.  К сожалению CentOS ставит вторую версию пакета, по этому перед выполнением команд следуют убедиться, что пакет не установлен или если установлен и версия ниже 3-й — удалить.

Непосредственно установка:

#yum install python-setuptools
#easy_install supervisor
 
# supervisord --version
3.1.3

Easy Install не создает нам конфигурационный файл и файл запуска демона:

Исправим это недоразумение.

echo_supervisord_conf > /etc/supervisord.conf

В конфигурационном файле снимаем комментарий с «[include]»:

[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 $?

Не забываем выдать права на запуск:

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: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
Вы можете оставить комментарий ниже.