Python 中 supervisor 库

官网
参考博客

介绍

是用 Python 开发的 client/server 服务,为 Linux/Unix 系统下的进程管理程序.

安装

1
pip install supervisor

安装之后(Ubuntu 22.04),~/.local/bin 目录下会出现三个程序:

  • supervisortd
  • supervisorctl
  • echo_supervisord_conf, 用于生成初始化配置文件 /etc/supervisord.conf

组成

其由两个主要组成部分:

  • supervisord, 一个守护进程,负责启动所管理的进程,并将所管理的进程作为自己的子程序启动,在所管理的进程出现崩溃时会自动重启
  • supervisorctl, 一个命令行管理工具,用于执行 stop, start, restart 等命令

创建配置文件

调用 echo_supervisord_conf 命令,先添加至 PATH 变量:

1
2
cd ~
vim .bashrc

添加: export PATH=$PATH:~/.local/bin

因为我们以普通用户操作,执行:

1
sudo chown user.user /etc/supervisord.conf

开始初始化:

1
$ echo_supervisord_conf > /etc/supervisord.conf

因后续权限问题还是把 /etc/supervisord.conf 的所属改为 root.

使用 include

/etc/supervisord.conf 文件的最后是:

1
2
[include]
files = relative/directory/*.ini

其用来为进程写配置文件.

此时创建一个目录并添加至 [include]:

1
2
$ sudo mkdir /etc/supervisor ;cd /etc/supervisor
$ sudo touch config.d

配置文件详解

  • command:启动程序使用的命令,可以是绝对路径或者相对路径
  • process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s
  • numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1
  • numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值
  • priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999
  • autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。
  • autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。
  • startsecs:程序启动后等待多长时间后才认为程序启动成功
  • startretries:supervisord尝试启动一个程序时尝试的次数。默认是3
  • exitcodes:一个预期的退出返回码,默认是0,2。
  • stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
  • stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间
  • stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组
  • killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。
  • user:如果supervisord以root运行,则会使用这个设置用户启动子程序
  • redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。
  • stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。
  • stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
  • stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份
  • stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
  • stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
  • stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true
  • stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
  • stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份
  • stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
  • stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
  • environment:一个k/v对的list列表
  • directory:supervisord在生成子进程的时候会切换到该目录
  • umask:设置进程的umask
  • serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url

配置文件实例

1
2
3
4
5
6
7
8
9
10
11
[program:sougou]   #souogu 为程序的名称
command=scrapy crawl sougou #需要执行的命令
directory=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders #命令执行的目录
environment=ASPNETCORE__ENVIRONMENT=Production #环境变量
user=root #用户
stopsignal=INT
autostart=true #是否自启动
autorestart=true #是否自动重启
startsecs=3 #自动重启时间间隔(s)
stderr_logfile=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders/ossoffical.err.log #错误日志文件
stdout_logfile=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders/ossoffical.out.log #输出日志文件

使用 web 界面管理

修改 /etc/supervisord.conf :

1
2
3
4
;[inet_http_server]         ; inet (tcp) server disabled by default
;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)

去掉注释符号:

1
2
3
4
[inet_http_server]         ; inet (tcp) server disabled by default
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 : 启动supervisor
  • supervisorctl reload :修改完配置文件后重新启动supervisor
  • supervisorctl status :查看supervisor监管的进程状态
  • supervisorctl start 进程名 :启动XXX进程
  • supervisorctl stop 进程名 :停止XXX进程
  • supervisorctl stop all:停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
  • supervisorctl update:根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

Python 中 supervisor 库
http://example.com/2022/08/28/Python-中-supervisor-库/
作者
Jie
发布于
2022年8月28日
许可协议