简介
Supervisor是一个C/S系统, 允许用户监控和管理一系列运行于类Unix系统上的进程。通常,我们使用Supervisor来监控一些进程,以便这些进程在意外退出后能够重新启动。
Supervisor有以下优点:
- 简单, ini风格的配置文件,容易阅读,对每个进程都提供了许多选项以便失败重启和日志轮替。
- 集中,一站式的进程启动,停止,监控平台。进程可以单独管理或分组管理,更提供了Web管理界面。
- 高效,通过fork/exec启动子进程且子进程不会进入守护模式,当子进程意外终止时,操作系统会立即发送信号给Supervisor,而不像其他方案那样,需要通过PID轮询。
- 可扩展,拥有非常简单的事件通知协议,任何编程语言程序都能监控它,也提供了XML-RPC管理接口,也为Python开发者预留了扩展空间。
- 兼容性,除了Windows,几乎可以运行于任何操作系统,已经测试过的包括Linux, Mac OS X, Solaris, 和 FreeBSD。
- 久经考验,虽然开发非常活跃,但Supervisor并不是新软件,它已经存在多年,广泛运行于许多服务器上。
组件
supervisord
Supervisor的服务程序称为supervisord,它负责启动子进程,响应客户端命令,重启crash了的进程,记录日志等工作。
服务进程使用一个配置文件,通常在/etc/supervisord.conf
supervisorctl
Supervisor的命令行客户端称为supervisorctl,为supervisord的功能提供类shell的操作界面。
通过supervisorctl, 可以连接到不同的Supervisor进程,获取Supervisor管理的子进程状态,启动、停止这些子进程。
命令行客户端通过UNIX socket或TCP socket与服务端通信。服务器可以要求客户端在执行命令时提供认证凭据。
WebServer
如果你在启动Supervisor时配置了网络socket(配置文件中的的[inet_http_server]),可以通过浏览器访问(http://localhost:9001/)完成与supervisorctl类似的功能。
XML-RPC 接口
上面的HTTP服务同时也提供了XML-RPC接口来管理Supervisor。具体内容请见 XML-RPC API
安装
使用easy_install安装
easy_install supervisor |
使用pip安装
pip install supervisor |
使用yum安装
yum install supervisor |
配置
如果没有配置文件,先创建配置文件
echo_supervisord_conf > /etc/supervisord .conf |
配置文件实例:
[unix_http_server]
file=/var/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ; socket 文件的 mode,默认是 0700
;chown=nobody:nogroup ; socket 文件的 owner,格式: uid:gid
;[inet_http_server] ; HTTP 服务器,提供 web 管理界面
;port=127.0.0.1:9001 ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性
;username=user ; 登录管理后台的用户名
;password=123 ; 登录管理后台的密码
[supervisord]
logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ; 日志文件大小,超出会 rotate,默认 50MB
logfile_backups=10 ; 日志文件保留备份数量默认 10
loglevel=info ; 日志级别,默认 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 文件
nodaemon=false ; 是否在前台启动,默认是 false,即以 daemon 的方式启动
minfds=1024 ; 可以打开的文件描述符的最小值,默认 1024
minprocs=200 ; 可以打开的进程数的最小值,默认 200
[supervisorctl]
serverurl=unix:///var/tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord
[programe:phpqueue]
command=php yii queue%(process_num)02d/listen ; 要执行的程序命令
;priority=999 ; 启动优先级,默认 999
numprocs=2 ; 启动的进程数
autostart=true ; 在 supervisord 启动时运行 默认 true
autorestart=true ; 意外退出时重启 默认 true
;startsecs=10 ; 程序保持运行的时间秒数 默认 10
;startretries=3 ; 失败重试次数 默认 3
;exitcodes=0,2 ; 期望的退出状态码 默认 0,2
;stopsignal=QUIT ; 杀进程信号 默认 TERM
;stopwaitsecs=10 ; SIGKILL 前默认最大等待秒数 默认 10
user=work ; setuid 到 某个 UNIX 账号来运行程序
log_stdout=true ; 是否记录 stdout 默认 true
log_stderr=true ; 是否记录 stderr 默认 false
logfile=/var/log/php-queue.log ; child log path, use NONE for none; default AUTO
logfile_maxbytes=10MB ; max # logfile bytes b4 rotation (default 50MB)
logfile_backups=10 ; # of logfile backups (default 10)
注意,上面的%(process_num)02d进行了数值格式化,phpqueue启动后会有两个进程:
- php yii queue01/listen
- php yii queue02/listen
程序分组
[group:phpqueues] programs=phpqueue1,phpqueue2 ;priority=999 |
启动
supervisord -c /etc/supervisord .conf |
管理
#查看状态
supervisorctl status
#停止程序
supervisorctl stop phpqueue
#启动程序
supervisorctl start phpqueue
#重启程序
supervisorctl restart phpqueue
#reload
supervisorctl reload
注意事项
- Supervisor无法监控守护进程启动的程序,如果确实需要监控,需要把该程序改为前台运行模式。
- 为了保证Supervisor的正常工作,请确保Supervisor在系统启动项里。