什么是supervisor?

时间:2023-02-19 12:55:00

supervisor是什么

supervisor是用python语言编写的,只能用于类Unix系统上的进程管理工具。

supervisor有什么用

举一个常见的场景,比如你的项目已经到了测试联调阶段,QA需要你把程序启动起来,然后进行测试,那么启动二进制文件最常用的运行命令是./二进制 &,这样可以使得程序在后台运行,即时关闭当前终端,也不会使程序终止。运行成功后,你开开心心的找女朋友约会去了,QA一顿猛如虎的操作,把程序搞挂了,打电话给你,需要你重启一下程序。此时你左手拿着电话,右手牵着女朋友的手,在心里问候了QA的家人 什么是supervisor? 为了不让女朋友生气,supervisor来了,它能够简单且高效地启动、重启、终止程序的运行,并且它能够检测程序是否正常运行,并且在程序挂掉后自动重启,并且还能把日志(err log,warning log)输出到指定位置,能够捕捉到QA遗漏的问题。

supervisor的组成

supervisor是由两个组件组成的,supervisordsupervisorctl

supervisord

当我们启动supervisor时,会启动一个父进程supervisord,所有由它管理的进程都成为它的子进程,supervisord统一管理这些子进程的启动、重启和终止。

supervisorctl

这是一个命令行管理工具,输入某些命令,如:start、stop、restart、status等,就可以对指定的子进程进行相应的操作了。

小结

可以这样简单理解起来,supervisord和supervisorctl理解成server和client。通过supervisorctl这个client接收命令,supervisord这个server对命令进行处理和响应。

安装supervisor

macOS:brew install supervisor
linux:pip install supervisor

安装完成后,得到的了如下3个二进制的命令:

echo_supervisor_conf: 将supervisor相关的所有配置打印出来。

supervisord:启动supervisor命令。

supervisorctl:管理我们托管在supervisor中的进程。

启动supervisor

systemctl start supervisord;
systemctl enable supervisord;

配置文件

[unix_http_server]
file=/run/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/var/log/supervisor/supervisord.log  ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/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)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

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

[include]
files = supervisord.d/*.ini

上面的配置文件,只截取了比较关键的几部分。需要注意三点:

  1. linux中的程序启动之后,会有个对应的socket文件。supervisord启动之后这个socket文件位置通过[unix_http_server]中的file指定。而且supervisorctl命令需要和supervisord在本地基于socket文件交互,所以[supervisorctl]中serverurl要和[unix_http_server]中的file保持同步。
  2. 上面这个配置文件[include]部分,它会加载supervisord.d/目录下所有的*.ini文件
  3. 在/etc目录下创建supervisor.d文件夹,用于存放.ini文件

.ini文件的作用就是:你想将程序A托付给supervisor管理,那就按要求的格式,为程序A创建一个A.ini配置文件,在这个文件中定义好,程序A的二进制文件在哪里、执行啥命令启动程序A、日志文件在哪等等。

下面是一个自定义.ini文件的示例

[program:supervisor1]
;supervisor1是自定义的项目名称,之后通过supervisorclt命令管理supervisor1
;command 启动程序的相对路径
command=/home/worker/workerspace/supervisor1.sh 
numprocs=1                                  
;directory 在执行command之前,需要切换到哪个目录中
directory=/home/worker/workerspace/  
;supervisord启动时,是否同时启动
autostart=true        
;autorestart意外退出后,是否重新启动
autorestart=true      
startsecs=30          
startretries=3        
exitcodes=0,2        
stopsignal=QUIT      
stopwaitsecs=10       
;user 使用哪个用户启动本程序
user=worker             
;redirect_stderr将标准错误,重定向到标准输出
redirect_stderr=true  
;stdout_logfile 标准输出的日志文件的位置
stdout_logfile=/home/worker/workerspace/supervisor1.stdout.log 
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=5                             
stdout_capture_maxbytes=1MB  
stdout_events_enabled=false   

supervisor的命令行

;有新的ini文件被添加进来时需要更新
supervisorctl update
;查看托管的全部进程或单个进程
supervisorctl status  [supervisor1]
supervisor1 RUNNING
;终止某个进程
supervisorctl stop supervisor1
supervisor1: stopped
;启动某个进程
supervisorctl start supervisor1
supervisor1: started
;重启某个进程
supervisorctl restart supervisor1
; 重新启动配置文件中所有进程
supervisorctl reload
Restarted supervisord

配置完成这些,你就可以放心的跟女朋友约会了,程序挂掉之后,supervisor会帮你重新启动。

欢迎关注 晴天码字,晴天会持续输出使用且有趣的文章

supervisor是什么

supervisor是用python语言编写的,只能用于类Unix系统上的进程管理工具。

supervisor有什么用

举一个常见的场景,比如你的项目已经到了测试联调阶段,QA需要你把程序启动起来,然后进行测试,那么启动二进制文件最常用的运行命令是./二进制 &,这样可以使得程序在后台运行,即时关闭当前终端,也不会使程序终止。运行成功后,你开开心心的找女朋友约会去了,QA一顿猛如虎的操作,把程序搞挂了,打电话给你,需要你重启一下程序。此时你左手拿着电话,右手牵着女朋友的手,在心里问候了QA的家人 什么是supervisor? 为了不让女朋友生气,supervisor来了,它能够简单且高效地启动、重启、终止程序的运行,并且它能够检测程序是否正常运行,并且在程序挂掉后自动重启,并且还能把日志(err log,warning log)输出到指定位置,能够捕捉到QA遗漏的问题。

supervisor的组成

supervisor是由两个组件组成的,supervisordsupervisorctl

supervisord

当我们启动supervisor时,会启动一个父进程supervisord,所有由它管理的进程都成为它的子进程,supervisord统一管理这些子进程的启动、重启和终止。

supervisorctl

这是一个命令行管理工具,输入某些命令,如:start、stop、restart、status等,就可以对指定的子进程进行相应的操作了。

小结

可以这样简单理解起来,supervisord和supervisorctl理解成server和client。通过supervisorctl这个client接收命令,supervisord这个server对命令进行处理和响应。

安装supervisor

macOS:brew install supervisor
linux:pip install supervisor

安装完成后,得到的了如下3个二进制的命令:

echo_supervisor_conf: 将supervisor相关的所有配置打印出来。

supervisord:启动supervisor命令。

supervisorctl:管理我们托管在supervisor中的进程。

启动supervisor

systemctl start supervisord;
systemctl enable supervisord;

配置文件

[unix_http_server]
file=/run/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/var/log/supervisor/supervisord.log  ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          ; (num of main logfile rotation backups;default 10)
loglevel=info               ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/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)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

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

[include]
files = supervisord.d/*.ini

上面的配置文件,只截取了比较关键的几部分。需要注意三点:

  1. linux中的程序启动之后,会有个对应的socket文件。supervisord启动之后这个socket文件位置通过[unix_http_server]中的file指定。而且supervisorctl命令需要和supervisord在本地基于socket文件交互,所以[supervisorctl]中serverurl要和[unix_http_server]中的file保持同步。
  2. 上面这个配置文件[include]部分,它会加载supervisord.d/目录下所有的*.ini文件
  3. 在/etc目录下创建supervisor.d文件夹,用于存放.ini文件

.ini文件的作用就是:你想将程序A托付给supervisor管理,那就按要求的格式,为程序A创建一个A.ini配置文件,在这个文件中定义好,程序A的二进制文件在哪里、执行啥命令启动程序A、日志文件在哪等等。

下面是一个自定义.ini文件的示例

[program:supervisor1]
;supervisor1是自定义的项目名称,之后通过supervisorclt命令管理supervisor1
;command 启动程序的相对路径
command=/home/worker/workerspace/supervisor1.sh 
numprocs=1                                  
;directory 在执行command之前,需要切换到哪个目录中
directory=/home/worker/workerspace/  
;supervisord启动时,是否同时启动
autostart=true        
;autorestart意外退出后,是否重新启动
autorestart=true      
startsecs=30          
startretries=3        
exitcodes=0,2        
stopsignal=QUIT      
stopwaitsecs=10       
;user 使用哪个用户启动本程序
user=worker             
;redirect_stderr将标准错误,重定向到标准输出
redirect_stderr=true  
;stdout_logfile 标准输出的日志文件的位置
stdout_logfile=/home/worker/workerspace/supervisor1.stdout.log 
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=5                             
stdout_capture_maxbytes=1MB  
stdout_events_enabled=false   

supervisor的命令行

;有新的ini文件被添加进来时需要更新
supervisorctl update
;查看托管的全部进程或单个进程
supervisorctl status  [supervisor1]
supervisor1 RUNNING
;终止某个进程
supervisorctl stop supervisor1
supervisor1: stopped
;启动某个进程
supervisorctl start supervisor1
supervisor1: started
;重启某个进程
supervisorctl restart supervisor1
; 重新启动配置文件中所有进程
supervisorctl reload
Restarted supervisord

配置完成这些,你就可以放心的跟女朋友约会了,程序挂掉之后,supervisor会帮你重新启动。

欢迎关注 晴天码字,晴天会持续输出使用且有趣的文章

什么是supervisor?