引入

由于单一项目需要使用不同的 workdir 以及 environment ,将 supervisor 从 2 更新到 3

卸载与安装

卸载旧的 supervisor ,安装最新的 supervisor

1
2
3
yum remove supervisor

pip install supervisor

service 配置

由于安装后的 supervisor 没有默认的 init script,官方[https://github.com/Supervisor/initscripts]只给出了 centos 7 的 systemd 的启动脚本,所以修改 redhat 的启动脚本以便使用,如下为修改后的 supervisord 启动脚本

1
vim /etc/init.d/supervisord
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#!/bin/bash
# Source function library
. /etc/rc.d/init.d/functions

# Source system settings
if [ -f /etc/sysconfig/supervisord ]; then
    . /etc/sysconfig/supervisord
fi

# Path to the supervisorctl script, server binary,
# and short-form for messages.
supervisorctl=/usr/local/bin/supervisorctl
supervisord=${SUPERVISORD-/usr/local/bin/supervisord}
prog=supervisord
pidfile=${PIDFILE-/var/run/supervisord.pid}
lockfile=${LOCKFILE-/var/lock/subsys/supervisord}
STOP_TIMEOUT=${STOP_TIMEOUT-60}
OPTIONS="${OPTIONS--c /etc/supervisord.conf}"
RETVAL=0

start() {
    echo -n $"Starting $prog: "
    daemon $supervisord $OPTIONS
    RETVAL=$?
    echo
    if [ $RETVAL -eq 0 ]; then
        touch ${lockfile}
        $supervisorctl $OPTIONS status
    fi
    return $RETVAL
}

stop() {
    echo -n $"Stopping $prog: "
    killproc -d ${STOP_TIMEOUT} $supervisord
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && rm -rf ${lockfile} ${pidfile}
}

restart() {
    stop
    start
}

case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    status)
        status -p ${pidfile} $supervisord
        RETVAL=$?
        [ $RETVAL -eq 0 ] && $supervisorctl $OPTIONS status
        ;;
    restart|force-reload|reload)
        restart
        ;;
    condrestart|try-restart)
        if status -p ${pidfile} $supervisord >&/dev/null; then
          stop
          start
        fi
        ;;
    *)
        echo $"Usage: $prog {start|stop|restart|condrestart|try-restart|force-reload|reload}"
        RETVAL=2
esac

exit $RETVAL

supervisor 项目配置

生成 supervisord.conf

1
/usr/local/bin/echo_supervisord_conf > /etc/supervisord.conf

修改配置

当前 supervisor 的配置中增加了许多功能,现在拿我的一个 celery 的服务配置来说,其中增加了一些变量,例如此处使用的 ENV_PATH,program_name 以及 host_node_name 等,同时页对日志进行了细分,可以打印更详细的日志

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
[program:detail_1]
directory=/search/hourong/ServicePlatform
environment=PYTHONPATH="/data/lib",PATH="%(ENV_PATH)s:/usr/local/bin",CONFIG_FILE="/data/lib/slave.spider.ini",CELERY_LOG_NAME="%(program_name)s"
command=/usr/local/bin/python -u /usr/local/bin/celery worker -A proj -P eventlet --autoscale=1000,3 -Q hotel_detail -l info -n "%(program_name)s_%(host_node_name)s"
process_name=%(program_name)s ;
numprocs=1
autostart=true
startsecs=1
startretries=3
autorestart=true
stopsignal=QUIT
stopwaitsecs=10
stdout_logfile=/var/log/%(program_name)s_out.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stderr_logfile=/var/log/%(program_name)s_err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB

小结

升级后可以对单一 program 配置 workdir 以及 environment 十分方便,而且还增加了 event 时间,可以连接报警,非常方便,各位同学如果有这些需要,可以尽早升级