一. Supervisor安装及配置gunicorn

Supervisor 是一个客户端服务器系统,包含有两个程序:

  • Supervisor的server部分称为supervisord。主要负责管理子进程,响应客户端的命令,log子进程的输出,创建和处理不同的事件
  • Supervisor的命令行客户端supervisorctl。它可以与不同的supervisord进程进行通信,获取子进程信息,管理子进程
# Centos6.5下的Supervisor下载(最好用pip装,用yum下载的版本问题比较多)
# 用pip下载的版本(4.x)需要在python3.x版本下运行
pip install supervisor

输入 echo_supervisord_conf 查看默认配置文件,如下:

; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
;
; Notes:
;  - Shell expansion ("~" or "$HOME") is not supported.  Environment
;    variables can be expanded using this syntax: "%(ENV_HOME)s".
;  - Quotes around values are not supported, except in the case of
;    the environment= options as shown below.
;  - Comments must have a leading space: "a=b ;comment" not "a=b;comment".
;  - Command will be truncated if it looks like a config file comment, e.g.
;    "command=bash -c 'foo ; bar'" will truncate to "command=bash -c 'foo ".

使用 echo_supervisord_conf > /etc/supervisord.conf 命令将配置文件保存在下面,然后修改配置文件。推荐的方式是修改配置文件路径到某个固定文件夹,如下:

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

配置

[program:minnan_sys]
command=/usr/.envs/project/bin/gunicorn -c gunicorn.conf.py wsgi:app
directory=/project_dir
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
user=root
loglevel=info
stdout_logfile=/var/log/supervisor/project_stdout.log
stderr_logfile=/var/log/supervisor/project_stderr.log

启动supervisord

supervisord -c supervisord.conf # 指定配置文件启动supervisord

启动supervisorctl

supervisorctl

supervisorctl 常用命令

service supervisord start # 启动服务
service supervisord restart # 重启服务 

supervisorctl # 进入supervisorctl命令行并列出当前所有项目的运行状态
supervisorctl reread # 重新读取配置
supervisorctl update  # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
supervisorctl stop program_name  # 停止某一个进程,program_name 为 [program:x] 里的 x
supervisorctl start program_name  # 启动某个进程
supervisorctl restart program_name  # 重启某个进程
supervisorctl stop all  # 停止全部进程upervisorctl reload  # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程

额外的设置(可选)

一. 非root用户也可使用supervisorctl

修改配置文件 /etc/supervisor.conf 的一个地方

[unix_http_server]
file=/var/run//supervisor.sock
chmod=0777  ; 原来是chmod=0700

二. 设置 HTTP 服务

加入如下两行到 /etc/supervisord.conf 中

[inet_http_server]
port = :9001

supervisorctl reload 重新加载配置。打开浏览器输入 http://localhost:9001, 就会看到管理页面了,网页上的功能也很全。

(简洁)参考 链接 (详细)参考 链接

二. Supervisor配置开机启动

在centos和rhel的环境下,我们一般是用chkconfig来管理服务的启动停止、开机自启动等。下面我列出Supervisord的服务脚本。

1. 执行如下命令

vim /etc/init.d/supervisord

2.输入如下内容

注意:该文件中的如下几个变量,都需要根据你实际的目录来改写。

PREFIX=/usr/local

SUPERVISORD=$PREFIX/bin/supervisord ##supervisord 程序的安装路径

SUPERVISORCTL=$PREFIX/bin/supervisorctl ##supervisorctl 程序的安装路径

PIDFILE=/var/supervisor/supervisord.pid ##需要先创建/var/supervisor目录

LOCKFILE=/var/supervisor/supervisord.lock

OPTIONS=”-c /etc/supervisord.conf” ##配置文件的路径

#!/bin/bash
#
# supervisord   This scripts turns supervisord on
# chkconfig:    345 83 04
# description:  supervisor is a process control utility.  It has a web based
#               xmlrpc interface as well as a few other nifty features.
#
 
# source function library
. /etc/rc.d/init.d/functions
 
set -a
 
PREFIX=/usr/local
 
SUPERVISORD=$PREFIX/bin/supervisord
SUPERVISORCTL=$PREFIX/bin/supervisorctl
 
PIDFILE=/var/supervisor/supervisord.pid
LOCKFILE=/var/supervisor/supervisord.lock
 
OPTIONS="-c /etc/supervisord.conf"
 
# unset this variable if you don't care to wait for child processes to shutdown before removing the $LOCKFILE-lock
WAIT_FOR_SUBPROCESSES=yes
 
# remove this if you manage number of open files in some other fashion
ulimit -n 96000
 
RETVAL=0
 
 
running_pid()
{
    # Check if a given process pid's cmdline matches a given name
    pid=$1
    name=$2
    [ -z "$pid" ] && return 1
    [ ! -d /proc/$pid ] && return 1
    (cat /proc/$pid/cmdline | tr "\000" "\n"|grep -q $name) || return 1
    return 0
}
 
running()
{
# Check if the process is running looking at /proc
# (works for all users)
 
    # No pidfile, probably no daemon present
    [ ! -f "$PIDFILE" ] && return 1
    # Obtain the pid and check it against the binary name
    pid=`cat $PIDFILE`
    running_pid $pid $SUPERVISORD || return 1
    return 0
}
 
start() {
        echo "Starting supervisord: "
 
        if [ -e $PIDFILE ]; then 
		echo "ALREADY STARTED"
		return 1
	fi
 
	# start supervisord with options from sysconfig (stuff like -c)
        $SUPERVISORD $OPTIONS
 
	# show initial startup status
	$SUPERVISORCTL $OPTIONS status
 
	# only create the subsyslock if we created the PIDFILE
        [ -e $PIDFILE ] && touch $LOCKFILE
}
 
stop() {
        echo -n "Stopping supervisord: "
        $SUPERVISORCTL $OPTIONS shutdown
	if [ -n "$WAIT_FOR_SUBPROCESSES" ]; then 
            echo "Waiting roughly 60 seconds for $PIDFILE to be removed after child processes exit"
            for sleep in  2 2 2 2 4 4 4 4 8 8 8 8 last; do
                if [ ! -e $PIDFILE ] ; then
                    echo "Supervisord exited as expected in under $total_sleep seconds"
                    break
                else
                    if [[ $sleep -eq "last" ]] ; then
                        echo "Supervisord still working on shutting down. We've waited roughly 60 seconds, we'll let it do its thing from here"
                        return 1
                    else
                        sleep $sleep
                        total_sleep=$(( $total_sleep + $sleep ))
                    fi
 
                fi
            done
        fi
 
        # always remove the subsys. We might have waited a while, but just remove it at this point.
        rm -f $LOCKFILE
}
 
restart() {
        stop
        start
}
 
case "$1" in
    start)
        start
        RETVAL=$?
        ;;
    stop)
        stop
        RETVAL=$?
        ;;
    restart|force-reload)
        restart
        RETVAL=$?
        ;;
    reload)
        $SUPERVISORCTL $OPTIONS reload
        RETVAL=$?
        ;;
    condrestart)
        [ -f $LOCKFILE ] && restart
        RETVAL=$?
        ;;
    status)
        $SUPERVISORCTL $OPTIONS status
        if running ; then
            RETVAL=0
        else
            RETVAL=1
        fi
        ;;
    *)
        echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
        exit 1
esac
 
exit $RETVAL

保存完毕之后,可以执行以下命令修改文件权限:

chmod 777 /etc/init.d/supervisord

3. 配置开机启动

执行以下命令:

chkconfig supervisord  on

可以以下命令查看是否成功

chkconfig --list | grep supervisord