1、supervisor是什么
supervisor是什么?它是一个名副其实的守护进程,用来管理、控制类unix操作系统中的多个进程,当所管理的进程因为某种原因停止运行后,supervisor能够及时的重新将服务拉起,保证服务持续、稳定运行,它就像你的守护者一样,当你遇到困难时,能够及时挺身而出,救你于危难。
supervisor是一个使用python开发服务端/客户端管理软件,其中服务端称为 supervisord,负责管理子进程、响应客户端命令、记录日志等,客户端称为 supervisorctl,它提供了一个类 shell 的接口,允许用户通过命令行与服务端通信,以控制子进程的状态。
可视化的管理页面:
可以重启、停止单个或者所有管理的进程:
最重要的是,还可能持续观察控制台的输出:
supervisor不仅能够保证我们服务的正常运行,还提供了非常简单、高效的工具,极大的降低了对后台任务管理的成本,非常推荐使用。
2、supervisor安装
下载supervisor源码:
wget https://files.pythonhosted.org/packages/ce/37/517989b05849dd6eaa76c148f24517544704895830a50289cbbf53c7efb9/supervisor-4.2.5.tar.gz
之后解压:
tar zxvf supervisor-4.2.5.tar.gz
执行命令,安装supervisor:
python3 setup.py install
查看supervisor是否安装成功:
supervisorctl -h
有以上打印,即为安装成功。
3、编写测试应用程序
我们先写一个简单的程序,之后使用supervisor将其启动,当程序出现问题后,也能自动重新将其拉起来。
程序就设计一个简单的,死循环打印当前时间,每1s打印一次。
package main
import (
"fmt"
"time"
)
func main() {
for {
fmt.Println(time.Now().Format("2006-01-02 15:04:05"))
time.Sleep(1 * time.Second)
}
}
4、创建supervisor配置
supervisor安装成功后,我们可以通过命令行:
echo_supervisord_conf
获得配置文件的demo,我们只需要稍加修改即可使用,对于配置的详细说明,可以参考官方文档:
https://www.supervisord.org/configuration.html
首先是对supervisor的服务端进行配置:
[unix_http_server]
file=/tmp/supervisor.sock ; the path to the socket file
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0: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)
; 客户端与服务端进行交互的通道
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
这里注意inet_http_server选项,如果要使用web管理页面访问supervisor,必须写成:
0.0.0.0:{PORT}
的形式,示例demo是127.0.0.1,这种写法无法访问web管理页面。
下面是对supervisord自身的配置:
一般情况下,我们只需要修改【logfile】字段即可,把supervisor运行的日志放到合适的路径下。
对supervisor客户端进行配置,只配置一个选项即可,设置客户端通过什么方式与服务端进行连接:
[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
serverurl=http://0.0.0.0:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as in [*_http_server] if set
;password=123 ; should be same as in [*_http_server] if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
接下来就是对要管理的服务进行配置了:
[program:supervisor_study_demo]
command=/root/career/supervisor_study/supervisor_study ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1 ; number of processes copies to start (def 1)
directory=/root/career/supervisor_study ; directory to cwd to before exec (def no cwd)
autostart=true ; start at supervisord start (default: true)
startsecs=1 ; # of secs prog must stay up to be running (def. 1)
startretries=3 ; max # of serial start failures when starting (default 3)
autorestart=true ; when to restart if exited after running (def: unexpected)
stopsignal=QUIT ; signal used to kill process (default TERM)
stdout_logfile=/root/career/supervisor_study/std.log ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=100MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10)
这里需要注意,对于【process_name】这个选项,配置的是进程启动的后名称:
如果是启动多个进程,进程名必须唯一,我们修改配置:
process_name=%(program_name)s_%(process_num)02d ; process_name expr (default %(program_name)s)
numprocs=2 ; number of processes copies to start (def 1)
启动后,进程名为:
配置就搞定了。
5、启动supervisor
启动命令:
supervisord -c supervisord.conf
-c参数是指定配置文件,按实际值传即可。
supervisor启动后,就可以通过web管理页面对你的后台任务进行管理了。
文中所用的示例代码、supervisor的配置都在如下地址,需要可取:
https://github.com/liupengh3c/career
完工,看个可爱的小熊休息一下,😄😄😄
欢迎小伙伴们关注、交流,也非常欢迎大家大家关注公众号微信沟通,知无不言~~~~~~~~~~。