Supervisor 的简介与使用
Supervisor 是 Linux 下一个进程管理的工具,主要的功能包括让程序自动启动、程序奔溃后自动重启,指定进程的数目等。本文主要讲述 Supervisor 在 Linux 下的安装与使用。
安装
由于 Supervisor 是用 python 写的,因此推荐利用 easy_install supervisor
或 pip install supervisor
进行安装。除此之外,还可通过 Linux 的包管理命令进行安装(源中需要包含这个包),如 Centos 下可通过 yum install supervisor
进行安装,Ubuntu 下可以通过 apt install supervisor
安装。
配置
Supervisor 的配置文件就只有一个,在安装完成后通过 echo_supervisord_conf > /etc/supervisord.conf
将创建一个默认的配置文件 /etc/supervisord.conf
, 当然也可以指定配置文件在其他目录下。配置文件以 []
来隔离每部分的配置内容,并且以 ;
为注释符号。
因为 Supervisor 由三部分组成:supervisord
、supervisorctl
、inet_http_server
。因此配置文件也分别根据这三部分阐述。需要注意的是 supervisorctl
、inet_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 程序supervisord
和 program
为最简配置,仅配置这两项就可以运行supervisor。运行方式为 supervisord -c /etc/supervisord.conf
, -c
参数指定了配置文件的路径,不指定该参数时会以一定的路径顺序寻找配置文件,并且会抛出warning,因此建议启动时要带有此参数。
上面的配置虽然能启动这些程序,但是当 supervisord 管理多个程序时,需要关闭或开启其中的一个程序就必须关闭 supervisord,然后修改配置文件并重启。为了单独管理这些程序,并直观看到每个程序的运行状态,就需要配置下面的 supervisorctl
和 inet_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
在不影响其他程序的情况下改变某个程序的运行状态。
更详细的内容请参考官方文档