Supervisor进程管理

简介

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在系统启动项里。
%1 $ S

发表回复