Linux的后台进程运行有好几种方法,例如nohup,screen等,但是,如果是一个服务程序,要可靠地在后台运行,我们就需要把它做成daemon,最好还能监控进程状态,在意外结束时能自动重启。

supervisor就是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

大概原理是,将 supervisord.conf 中的配置作为子进程启动,这样就可以控制其整个生命周期,并进行监控。

安装

ubuntu 可以使用 apt-get install supervisor,CentOS 可以使用 yum install supervisor

也可以使用 easy_install,执行 easy_install supervisor,或者使用 pip,执行 pip install supervisor

配置

在终端执行 echo_supervisord_conf 会将默认配置输出到终端,可以使用 echo_supervisord_conf > /etc/supervisord.conf 来生成默认配置文件。

配置文件搜索优先级:

  1. $CWD/supervisord.conf
  1. $CWD/etc/supervisord.conf
  2. /etc/supervisord.conf
  3. /etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
  4. ../etc/supervisord.conf
  5. ../supervisord.conf

也可以在其他的目录生成后,启动 supervisord 时使用 -c 选项来指定配置文件,例如 supervisord -c path/to/supervisord.conf

主要命令

主要命令有两个,一个是 supervisord,用来启动 supervisor 服务。一个是 supervisorctl,用来控制 supervisor,包含 start, stop, restart 等。

测试

测试文件,test.sh:

1
2
3
4
5
6
7
#!/bin/bash

while true
do
  echo `date '+%F %T'`
  sleep 3
done

我们新建一个配置文件,然后在主配置文件中的 [include] 块中引入,(这是比较建议的方式,如果配置文件比较长,使用这种方式可以便于管理):

1
2
3
4
# /home/ins/supervisord.conf 文件
[include]
;files = relative/directory/*.ini
files = supervisord-test.conf
1
2
3
4
5
6
7
8
# /home/ins/supervisord-test.conf 文件
[program:bar]
command=/home/ins/test.sh
user=ins
process_name=%(process_num)02d
numprocs=2
autostart=true
stdout_logfile=/home/fyzzy/tmp/%(program_name)s_%(process_num)02d.log

然后执行 supervisord -c supervisord.conf 来启动服务,启动后执行 supervisorctl 进入 supervisor 控制台,可以看到进程们的状态。

[ins@centos-test ~]$ supervisorctl bar:00 RUNNING pid 6189, uptime 0:03:40 bar:01 RUNNING pid 6190, uptime 0:03:40

tmp 目录下,可以看到 bar_00.log 和 bar_01.log 文件,里面是命令的输出。

tip:stdout_logfile 选项中的路径必须存在,不然会报错。

在控制台内输入 help 可以查看控制台内命令。

tip:在测试时可能会频繁修改配置,修改后在控制台里执行 reload 就可以重新加载配置,不用重启服务。

其他

web server

supervisor 还有 web server,在配置文件中的 [inet_http_server] 块中配置,配置后可通过web页面管理进程。

XML_RPC 接口

supervisor 提供 XML_RPC 来方便外部调用,并且有很多第三方类(包括php)。

其他

supervisord.conf 中包含很多种控制块,可以实现不同的功能。supervisor 还提供 事件监听 功能。

参考资料