supervisor是什么
supervisor是用python语言编写的,只能用于类Unix系统上的进程管理工具。
supervisor有什么用
举一个常见的场景,比如你的项目已经到了测试联调阶段,QA需要你把程序启动起来,然后进行测试,那么启动二进制文件最常用的运行命令是./二进制 &
,这样可以使得程序在后台运行,即时关闭当前终端,也不会使程序终止。运行成功后,你开开心心的找女朋友约会去了,QA一顿猛如虎的操作,把程序搞挂了,打电话给你,需要你重启一下程序。此时你左手拿着电话,右手牵着女朋友的手,在心里问候了QA的家人
为了不让女朋友生气,supervisor来了,它能够简单且高效地启动、重启、终止程序的运行,并且它能够检测程序是否正常运行,并且在程序挂掉后自动重启,并且还能把日志(err log,warning log)输出到指定位置,能够捕捉到QA遗漏的问题。
supervisor的组成
supervisor是由两个组件组成的,supervisord和supervisorctl。
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
上面的配置文件,只截取了比较关键的几部分。需要注意三点:
- linux中的程序启动之后,会有个对应的socket文件。supervisord启动之后这个socket文件位置通过[unix_http_server]中的file指定。而且supervisorctl命令需要和supervisord在本地基于socket文件交互,所以[supervisorctl]中serverurl要和[unix_http_server]中的file保持同步。
- 上面这个配置文件[include]部分,它会加载supervisord.d/目录下所有的*.ini文件
- 在/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会帮你重新启动。
欢迎关注 晴天码字,晴天会持续输出使用且有趣的文章