Supervisor安装与配置

Supervisor是一款用Python实现的进程管理工具,可以实现启动,关闭,重启由它管理的进程,并自动将进程转为daemon的方式来运行,如果程序因为异常退出或者被人为的kill掉,Supervisor会自动重启该进程。例如:用它来管理由uwsgi启动的WSGI服务器进程。

安装Supervisor

使用pip install supervisor,如果提示Permission Denied,则使用sudo pip install supervisor。如果需要安装的linux环境无法连接外网,直接离线安装,参考:http://supervisord.org/installing.html

创建Supervisor默认配置文件

一旦Supervisor安装成功后,可以使用

sudo echo_supervisord_conf > /etc/supervisord.conf

来生成默认的配置文件。文件中大部分内容都是用分号(;)注释掉的,配置文件的格式是ini格式。

当然你也可以直接使用

sudo vim /etc/supervisord.conf

来直接创建supervisord.conf文件。

下面是一个示例的配置文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[unix_http_server]
; (the path to the socket file)
file=/var/tmp/supervisor.sock
; socket file mode (default 0700)
chmod=0700

[supervisord]
; (main log file;default $CWD/supervisord.log)
logfile=/var/log/supervisor/supervisord.log
; (supervisord pidfile;default supervisord.pid)
pidfile=/var/run/supervisord.pid
; ('AUTO' child log dir, default $TEMP)
childlogdir=/var/log/supervisor
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
; use a unix:// URL for a unix socket
serverurl=unix:///var/tmp/supervisor.sock
[include]
files = supervisor/conf.d/*.ini

注意:在上述这个配置文件中把Supervisor本身的配置和Supervisor管理的Program的配置分开来了,秘密就在[inlcude]这段配置下。最好在使用Supervisor来配置受管理的Program时,使用这种方式。这个方式有两个好处:

  • 将Supervisor本身的配置和受管理的进程配置分离开来,在配置上更清晰了
  • 所有的Supervisor管理的进程配置文件位于/etc/supervisor/conf.d下,并且以ini作为文件后缀,方便管理Supervisor配置的进程。如果不想要让Supervisor管理某个进程只需要使用mv命令将该配置移动其他目录或者修改为.bak结尾的文件即可。

如果新增新的Program,只需要在/etc/supervisor/conf.d目录新建该程序对应的ini文件。下面是ini文件的一个示例:

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
[program:flumelog] 
; command填写启动命令,例如下面的启动Flume的命令
command=/usr/share/flume/bin/flume-ng agent -n log -c /usr/share/flume/conf -f /usr/share/flume/conf/log.properties

; directory指定启动的目录
directory=/usr/share/flume/

; user设置启动该Program的用户
user=app

; numprocs设置启动几个进程
numprocs=1

; stdout_logfile用来设置stdout的日志文件地址
stdout_logfile=/data/log/flume/flumelog.log

; stderr_logfile用来设置stderr(错误)的日志文件地址
stderr_logfile=/data/log/flume/flumelog.log

; autostart设置是否自动启动
autostart=true

; autorestart设置当Program意外退出后自动重启
autorestart=true

; startsecs指定启动Program的秒数
startsecs=10

; startretries设置启动的重试次数
startretries=10

; stopwaitsecs设置Program停止等待的秒数
stopwaitsecs = 600

; killasgroup杀掉整个进程组,包含启动进程创建的子进程。
killasgroup=true

; priority设置程序的优先级
priority=999

; logfile_maxbytes设置日志文件大小
logfile_maxbytes=20MB

; logfile_backups设置
logfile_backups=20

; environment设置启动该Program的环境变量
; Program对应的环境变量。
environment=HOME="/home/app",USER="app",JAVA_HOME="/usr/java/default"

注意:如果Supervisor以root权限启动,那么启动Program的环境变量就是root的对应的环境变量。注意:在某些情况下,由于环境变量设置不合理,导致无法通过Supervisor来启动Program,可以通过设置environment来强制指定启动Program的环境变量来解决。

启动Supervisor

使用sudo supervisord -c /etc/supervisord.conf来启动Supervisor守护进程

使用supervisorctl来管理进程

查看supervisor管理的进程状态

sudo supervisorctl status

更新supervisoir管理的进程

如果在/etc/supervisor/conf.d新增了新的进程配置ini文件,可以使用如下命令来添加新的进程。

sudo supervisorctl update

更新Supervisor配置

可以使用

sudo supervisorctl reload

来更新supervisor的配置。注意:使用该命令会导致受supervisor管理的进程都进行重启。

重启,启动,停止进程

sudo supervisorctl restart flumelog
sudo supervisorctl start flumelog
sudo supervisorctl stop flumelog

其中,flumelog对应在上述Program配置中的名称,可以通过sudo supervisorctl status来查看program的名称。

问题和诊断

  1. 如果启动Program的过程中出现BACKOFF Exited too quickly (process log may have details)。

    可以通过查看在stderr_logfile配置的log文件来分析到底是因为什么原因导致没有成功启动配置的Program。

参考

  1. 用Supervisord管理Python进程 | @飞龙非龙
    http://feilong.me/2011/03/monitor-processes-with-supervisord
  2. Supervisor Run Program as Non-root
    http://ju.outofmemory.cn/entry/103009