Supervisor 的简介与使用

Supervisor 是 Linux 下一个进程管理的工具,主要的功能包括让程序自动启动、程序奔溃后自动重启,指定进程的数目等。本文主要讲述 Supervisor 在 Linux 下的安装与使用。

安装

由于 Supervisor 是用 python 写的,因此推荐利用 easy_install supervisorpip install supervisor 进行安装。除此之外,还可通过 Linux 的包管理命令进行安装(源中需要包含这个包),如 Centos 下可通过 yum install supervisor 进行安装,Ubuntu 下可以通过 apt install supervisor 安装。

配置

Supervisor 的配置文件就只有一个,在安装完成后通过 echo_supervisord_conf > /etc/supervisord.conf 将创建一个默认的配置文件 /etc/supervisord.conf, 当然也可以指定配置文件在其他目录下。配置文件以 [] 来隔离每部分的配置内容,并且以 ; 为注释符号。

因为 Supervisor 由三部分组成:supervisordsupervisorctlinet_http_server。因此配置文件也分别根据这三部分阐述。需要注意的是 supervisorctlinet_http_server 并非是必须要配置的,这两个均是连接 supervisord 的客户端,用于观察和管理 supervisord 监控的程序。

supervisord

supervisord 是 Supervisor 的核心,主要用与启动程序,在程序奔溃时自动重启,设定程序的进程数目、输出的日志文件路径等。

supervisored 有多个参数,下面主要讲述其中几种较为重要的最简配置,每个参数的含义可参考官方文档

下面就是 supervisord 配置的一个简单例子

1
2
3
4
5
6
7
[supervisord]
logfile=/var/log/supervisor/supervisord.log ;日志文件的目录
pidfile=/var/run/supervisord.pid ; pid文件目录
; logfile_maxbytes = 50MB ;默认的日志文件的大小
; loglevel = info ; 默认的日志的记录等级
; umask = 002; 默认的进程umask
; nodaemon = false ;默认在后台启动,若为true则在前台启动
上面注释掉的配置项为 supervisord 的默认配置项,可以不配置。

除了配置 supervisord 外,还需要配置被其管理的程序。详细的参数可见官方文档,下面是一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
[program:robot] ; 标示一个程序[program:XXX],XXX为自定义的程序名称
command = /usr/bin/xvfb-run python /home/amazon/v0/Robot.py;运行程序所需命令
;autostart=true ;默认跟随supervisord启动而启动
autorestart=true ;程序退出后自动重启
; startretries = 3; 程序出错时,连续重启的最大次数,超过该次数后,进程进入FATAL转态
; startsecs = 1; 程序启动后多少秒内认为其启动成功
; numprocs = 1 ;启动的进程数目,默认为1
; priority = 999 ; 程序的优先级,默认为999,该值越小,表示优先级越高
user=root ;程序启动的用户,只用root用户才能指定这一项;不指定时该值为启动supervisord的用户
stdout_logfile = /home/amazon/log/Robot.log ;存储程序标准输出流的文本文件
stderr_logfile = /home/amazon/log/Robot_err.log ; 存储程序出错时错误提示的文件
; stopasgroup = false;以进程组的方式停止进程,默认为false,以上面为例,假如为false时,停止该程序时只会停止 python运行的程序,而不会停止 xvfb 程序
上面注释的配置项为程序默认的配置,可以不配置。上面给出的 supervisordprogram 为最简配置,仅配置这两项就可以运行supervisor。运行方式为 supervisord -c /etc/supervisord.conf, -c 参数指定了配置文件的路径,不指定该参数时会以一定的路径顺序寻找配置文件,并且会抛出warning,因此建议启动时要带有此参数。

上面的配置虽然能启动这些程序,但是当 supervisord 管理多个程序时,需要关闭或开启其中的一个程序就必须关闭 supervisord,然后修改配置文件并重启。为了单独管理这些程序,并直观看到每个程序的运行状态,就需要配置下面的 supervisorctlinet_http_server

inet_http_server

inet_http_server 是 supervisord 内置的一个 http 浏览器,用于查看、管理每个程序的运行状态,配置项如下:

1
2
3
4
[inet_http_server]
port = 110.64.55.128:9001
username = XXXX
password = XXXX

上面的配置应该比较容易理解,访问 port 后输入用户名和密码验证身份后即可观察到程序运行的状态,下图为访问时观察到的效果。

上图可以看到每个程序的运行状态,pid 以及运行时长,还可以改变程序的运行状态。

supervisorctl

supervisorctl 的功能与 inet_http_server 一样,只是 inet_http_server 是有界面的,而 supervisorctl 是在命令行下使用的,配置项如下:

1
2
3
4
[supervisorctl]
serverurl = http://110.64.55.128:9001 ;http服务器的地址
username = XXXX ;与 [inet_http_server] 配置项的username相同
password = XXXX ;与 [inet_http_server] 配置项的password相同

通过 supervisorctl 即可观察到程序运行的状态,如下图所示

同时可以通过 supervisorctl start|stop|restrt XXX 来启动、停止、重启程序 XXX,其中 XXX 为配置 [program:XXX] 指定的名称。

下面是综合以上所说的完整的 supervisord.conf 配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid

[program:robot]
command = /usr/bin/xvfb-run python /home/amazon/v0/Robot.py
autorestart=true
stdout_logfile = /home/amazon/log/Robot.log
stderr_logfile = /home/amazon/log/Robot_err.log

[inet_http_server]
port = 110.64.55.128:9001
username = XXXX
password = XXXX

[supervisorctl]
serverurl = http://110.64.55.128:9001
username = XXXX
password = XXXX

从上面可知,既然 supervisorctl 提供的功能和 inet_http_server 的相同,那么是否可以不启动 http 服务器,仅仅通过 supervisorctl 进行观察呢?

答案是可以的,但是要通过 unix socket 与 supervisord 通信,将上面的 [inet_http_server] 部分改成 [unix_http_server],并修改 [supervisorctl]serverurl 部分,完整的配置文件如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid

[program:robot]
command = /usr/bin/xvfb-run python /home/amazon/v0/Robot.py
autorestart=true
stdout_logfile = /home/amazon/log/Robot.log
stderr_logfile = /home/amazon/log/Robot_err.log

[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
username = XXXX
password = XXXX

[supervisorctl]
serverurl = unix:///var/run/supervisor.sock
username = XXXX
password = XXXX

使用

综上,supervisor 的一般的使用方法为如下:

1)配置好需要启动的程序 2)通过 supervisord -c /etc/supervisord.conf 启动 supervisord 3)通过 supervicorctl 和日志文件查看每个程序状态,通过 supervicorctl start|stop|restart XXX 在不影响其他程序的情况下改变某个程序的运行状态。

更详细的内容请参考官方文档