Supervisor工具的简单使用

入职新公司接触到的一个高效任务管理工具

Posted by     BY   杨晓明 on October 19, 2017

1. 什么是Supervisor?

Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor 同时启动所有应用程序而不是一个一个地敲命令启动。

2. 组成部分

  1. supervisord(server 部分):主要负责管理子进程,响应客户端命令以及日志的输出等;
  2. supervisorctl(client 部分):命令行客户端,用户可以通过它与不同的 supervisord 进程联系,获取子进程的状态等。

3. 安装

Supervisor 可以运行在 Linux、Mac OS X 上。如前所述,supervisor 是 Python 编写的,所以安装起来也很方便,可以直接用 pip 来安装:

sudo pip install supervisor 

4. 配置

在 supervisor 中,一个配置文件对应一个服务(进程)。想要使用 supervisor 管理某个服务,则在/etc/supervisord.d/目录下新建相应的.conf文件。此外,supervisor 还有一个主配置文件:/etc/supervisord.conf。接下来先对于主配置文件进行说明,再以服务实例说明/etc/supervisord.d/目录下的单配置文件。

(1). /etc/supervisord.conf文件

[unix_http_server]
file=/tmp/supervisor.sock		; UNIX socket 文件,supervisorctl 会使用

[inet_http_server]				; HTTP 服务器,提供 web 管理界面
port=0.0.0.0: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
umask=022						; umask值
user=www						; 运行supervisord的用户
directory=/tmp					;[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock		; use a unix:// URL  for a unix socket

[include]
files = /etc/supervisord.d/*.conf			; 载入被管理服务的配置文件

类似这样的一份配置文件,足以让我们把supervisor服务跑起来了。

(2). /etc/supervisord.d/*.conf文件

[program:checkUpdatePraiseNum]
command= /usr/local/php/bin/php /data/www/asyn.api/app/index.php check checkUpdatePraiseNum
; ↑任务启动命令
priority=2
numprocs=1
autostart=true
autorestart=true
startretries=10
stopsignal=KILL
stopwaitsecs=1
redirect_stderr=false
;user=app                   ; setuid to this UNIX account to run the program
stdout_logfile=/var/log/asyn/checkUpdatePraiseNum.log       ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=10MB   ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=1     ; # of stdout logfile backups (default 10)
stdout_events_enabled=false   ; emit events on stdout writes (default false)
stderr_logfile=/var/log/asyn/checkUpdatePraiseNum.log         ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=1     ; # of stderr logfile backups (default 10)
stderr_events_enabled=false   ; emit events on stderr writes (default false)
serverurl=AUTO                ; override serverurl computation (childutils)

5. 命令

  1. supervisord: 初始启动 Supervisord,启动、管理配置中设置的进程;
  2. supervisorctl stop(start, restart) xxx,停止(启动,重启)某一个进程 (xxx);
  3. supervisorctl reread: 只载入最新的配置文件, 并不重启任何进程;
  4. supervisorctl reload: 载入最新的配置文件,停止原来的所有进程并按新的配置启动管理所有进程;
  5. supervisorctl update: 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启;

6. 其他值得注意的地方

在配置文件中,设置了日志文件的目录。该目录必须存在,否则将启动不了。日志文件可以不手动创建(supervisor会自动创建),已经手动创建的日志文件,一定要注意文件的权限,保证supervisorctl一定要有写的权限。