什么是 supervisor

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

supervisor 通过 fork/exec 的方式把被管理的进程当作 supervisor 的子进程来启动,这样只要在 supervisor 的配置文件中,把要管理的进程的可执行文件的路径写进去即可。 supervisor 实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。

supervisor 还提供了一个功能,可以为 supervisord 或者每个子进程,设置一个非 root 的 user,这个 user 就可以管理它对应的进程。

安装

CentOS 通过 epel-release 安装

yum -y install epel-releaes

yum -y install supervisor

Ubuntu/Debian/Deepin 安装

apt   update

apt -y install supervisor

通过 pip 安装

pip install supervisor

配置

supervisord.conf 是给 supervisord 和 supervisorctl 读取使用的 ,可以使用 echo_supervisord_conf 生成默认配置文件。

如果在没有-c 选项的情况下启动任一应用程序(用于明确告知应用程序配置文件名的选项),应用程序将按指定的顺序在以下位置查找名为 supervisord.conf 的文件。它将使用它找到的第一个文件:

./supervisord.conf

./etc/supervisord.conf

/etc/supervisord.conf

/etc/supervisor/supervisord.conf(自Supervisor 3.3.0起)

../etc/supervisord.conf(相对于可执行文件)

../supervisord.conf(相对于可执行文件)

生成配置文件

echo_supervisord_conf  > /etc/supervisord.conf

[unix_http_server] 设置

[unix_http_server]

file=/tmp/supervisor.sock   ; socket的路径

;chmod=0700                 ; socket的权限 (默认 0700)

;chown=nobody:nogroup       ; socket的用户组

;username=user              ; 验证用户(默认没有)

;password=123               ; 验证密码(默认没有)

[inet_http_server] 设置

提供一个 http 服务页面,可以对任务进行操作

;[inet_http_server]
;port=127.0.0.1:9001        ; ip_address:port specifier, *:port for all iface

;username=user              ; default is no username (open server)

;password=123               ; default is no password (open server)

[supervisord] 设置

supervisord 的相关配置,这个是最要的进程配置,如果在 docker 容器里面一般是修改配置文件 nodaemon=true,不使用 daemon 方式运行程序,保证容器的存活。

[supervisord]

logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log

logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB

logfile_backups=10           ; # of main logfile backups; 0 means none, default 10

loglevel=info                ; log level; default info; others: debug,warn,trace

pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid

nodaemon=false               ; start in foreground if true; default false

minfds=1024                  ; min. avail startup file descriptors; default 1024

minprocs=200                 ; min. avail process descriptors;default 200

;umask=022                   ; process file creation umask; default 022

;user=chrism                 ; default is current user, required if root

;identifier=supervisor       ; supervisord identifier, default is 'supervisor'

;directory=/tmp              ; default is not to cd during start

;nocleanup=true              ; don't clean up tempfiles at start; default false

;childlogdir=/tmp            ; 'AUTO' child log dir, default $TEMP

;environment=KEY="value"     ; key value pairs to add to environment

;strip_ansi=false            ; strip ansi escape codes in logs; def. false

[include] 设置

include 设置可以让我们分多个文件对不同的程序进行管理。此设置可以列出多个文件(由空白或换行分隔)。它还可以包含通配符。文件名被解释为相对于这个文件。包含的文件*不能包含文件本身。

;[include]
;files = relative/directory/*.ini

[program:x] 设置

这里是定义要守护进程的相关设置,如果多个程序,就设置多个配置段就可以了。

;项目名
[program:blog]
;脚本执行命令
command=/usr/bin/python /opt/bin/test.py

;supervisor启动的时候是否随着同时启动,默认True
autostart=true

;当程序exit的时候,这个program不会自动重启,默认unexpected,设置子进程挂掉后自动重启的情况,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动;如果设置为true,就是只要进程退出就重启进程。
autorestart=false

;这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了。默认值为1
startsecs=1

;这个选项是在启动失败后,重试多少次
startretries=3

;日志输出
stderr_logfile=/tmp/blog_stderr.log
stdout_logfile=/tmp/blog_stdout.log

;脚本运行的用户身份
user = opcai

;把 stderr 重定向到 stdout,默认 false
redirect_stderr = true

;stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20M

;stdout 日志文件备份数
stdout_logfile_backups = 20

启动

如果是系统安装的包,一般都是有对应的服务文件,这里可以手动启动

supervisord   -c  /etc/supervisord.conf

任务控制

supervisorctl   -c  /etc/supervisord.conf
supervisor> help

default commands (type help <topic>):
=====================================
add    exit      open  reload  restart   start   tail
avail  fg        pid   remove  shutdown  status  update
clear  maintail  quit  reread  signal    stop    version

上面是命令行支持的命令