Supervisor
Supervisor 是一个客户端/服务器系统,允许用户在UNIX操作系统上监视、控制用户进程。从定义里面分析包含两层意思。
- 监控进程 - 监控进程状态 确定当前进程是否发生异常
- 控制进程 - 针对进程异常情况 控制进程的行为 如重启当前进程
Supervisor 通过 Fork 子进程的方式,启动用户进程 - (应用程序),因此父进程可以实时感知到子进程各种状态,从而根据状态分析达到控制进程的目的。
这是一个非常有用的运维小工具,假设公司的项目没有使用Docker、K8S等容器化管理等技术进行系统部署,那么难免发生系统奔溃、意外宕机、服务异常等情况。特别是节假日或者非工作日的时候,需要第一时间重启应用,保证服务正常运行。
软件安装
系统要求
Supervisor在大多数UNIX系统上运行良好,支持Linux(Ubuntu 18.04)、Mac OS X(10.4/10.5/10.6)、Solaris(10 for Intel)和FreeBSD 6.1上运行。Supervisor不支持Windows系统,Supervisor支持Python 3 3.4版 及以上版本;Python 2 支持 Python 2 2.7版及以上版本。
系统组件
Supervisor由supervisord、supervisorctl、Web Server、XML-RPC Interface 几个核心组件组成,下面对它们对详细的介绍:
supervisord
supervisord 是Supervisor服务端组成部分,负责启动子程序、响应客户端命令、重启崩溃或者退出的子进程,记录子进程stdout、stderr输出,并生成和处理与子进程生存期中的点相对应的“事件”。
服务器进程使用配置文件,此配置文件通常位于/etc/supervisord.conf中。通过适当的文件系统权限确保此文件的安全非常重要,因为它可能包含未加密的用户名和密码。
supervisorctl
Supervisor 客户端部分名为supervisorctl。它为supervisord提供的功能提供了一个类似shell的接口。通过supervisorctl,用户可以连接到不同的supervisord进程,获取由控制的子进程的状态,停止和启动的子进程,以及获取supervisord正在运行的进程列表。
命令行客户端通过UNIX域套接字或internet(TCP)套接字与服务器通信。服务器可以断言客户端的用户在允许他执行命令之前应该出示身份验证凭据。客户机进程通常使用与服务器相同的配置文件。
Web Server
Web 交互界面,跟supervisorctl类似,提供可视化的Web用户界面。启用该功能后,访问服务器URL(例如: http://localhost:9001/), 通过web界面查看控制进程状态。
XML-RPC Interface
HTTP服务器暴露XML-RPC接口,可通过接口用于询问、控制 Supervisor 进程以及派生的子进程
安装
pip install supervisor
配置
Supervisor 配置文件通常命名为 supervisord.conf,服务端程序supervisord、客户端程序supervisorctl都需要使用该配置。如果启动时,没有指定 -c 参数。那么默认从以下目录中寻找第一个文件
../etc/supervisord.conf
(相对路径 默认从当前目录开始寻找)../supervisord.conf
(相对路径 默认从当前目录开始寻找)$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/etc/supervisor/supervisord.conf
(Supervisor 3.3.0以上版本)
创建系统目录
mkdir -p ~/tool/util/supervisor
mkdir -p ~/tool/util/supervisor/log
mkdir -p ~/tool/util/supervisor/tmp
# 创建应用系统配置文件夹
mkdir -p ~/tool/util/supervisor/conf.d
# 创建 supervisor 配置文件
vim ~/tool/util/supervisor/supervisord.conf
创建服务端配置
# supervisord.conf
[unix_http_server]
file=~/tool/util/supervisor/tmp/supervisor.sock
chmod=0700
[supervisord]
logfile = ~/tool/util/supervisor/log/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = ~/tool/util/supervisor/tmp/supervisord.pid
nodaemon = False
minfds = 256
minprocs = 200
umask = 022
identifier = supervisor
directory = ~/tool/util/supervisor/tmp
nocleanup = true
childlogdir = ~/tool/util/supervisor/tmp
[supervisorctl]
serverurl = unix:///usr/local/tmp/supervisor.sock
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
# supervisor服务端启动时 根据应用系统配置 启动应用程序
[include]
files = conf.d/*.conf
应用系统配置
# cd ~/tool/util/supervisor/conf.d
# vim springboot-study.conf
# spring-boot-study 系统名称
[program:spring-boot-study]
directory = /${path}/springboot-study ; 程序的启动目录 (最好使用绝对路径),根据实际情况替换 ${path}
command = java -Xms512m -Xmx512m -jar target/springboot-study-0.0.1-SNAPSHOT.jar ; 启动命令,可以看出与手动在命令行启动的命令是一
样的
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 30 ; 启动 30 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = andy ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = ~/tool/util/supervisor/log/springboot-test.log ;应用日志目录 (最好使用绝对路径),根据实际情况替换 ${path}
启动服务端
# 在启动服务的过程中 出现以下错误,可能是由于mac系统权限导致,需要更改配置文件中的目录
# INFO Increased RLIMIT_NOFILE limit to 1024
# socket.error reported errno.EACCES
# 第一步 进入目录
cd ~/tool/util/supervisor
# 第二步 指定配置文件并启动
supervisord -c supervisord.conf
# 第三步 查看启动进程
ps -ef | grep supervi
启动常规错误
在学习supervisor工具过程中可能需要频繁关闭重启,通常使用 kill 9 -pid 杀死进程然后重启,但是会遇到以下错误
# 查找进程id
ps -ef | grep supervisor
# 杀死进程
kill -9 pid
# 重启
supervisord -c supervisord.conf
Unlinking stale socket /Users/andy/tool/util/supervisor/tmp/supervisor.sock
解决以上错误有两种方式
- rm -rf tmp/*
- unlink tmp/supervisor.sock
基本命令
supervisorctl
- supervisorctl status - 查看启动的应用程序
- supervisorctl shutdown - 关闭应用程序和supervisor服务
- supervisorctl stop spring-boot-study - 关闭应用程序
- supervisorctl start spring-boot-study - 启动应用程序
- supervisorctl restart spring-boot-study - 重启应用程序
- supervisorctl reload - 重启supervisor服务 停止原有程序 重新启动进程
- supervisorctl update - 根据配置文件 重启进程
Web 管理界面
SuperVisor 提供简单的web可视化界面,以达到管理应用程序(停止、重启、查看日志)的目的。优点是不需要使用登录服务器使用 supervisorctl工具管理应用进程(毕竟,生产环境的服务器尽量做到专人管理)。SuperVisor默认不开启HTTP服务,需要在 supervisord.conf 配置文件中增加以下内容
[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123
重启服务,在浏览器输入 127.0.0.1:9001
进程自动重启
了解前面的基础知识后,终于来到了今天学习的目的 - 当应用程序崩溃后,服务能够自动重启。测试顺序如下
-
查看进程状态
AndydeMacBook-Pro:supervisor andy$ supervisorctl status spring-boot-study RUNNING pid 70332, uptime 0:39:34
-
手动杀死应用进程
kill -9 70332
-
重新查看进程状态
AndydeMacBook-Pro:supervisor andy$ supervisorctl status spring-boot-study RUNNING pid 70729, uptime 0:00:40
重新查看应用状态,发现PID 已经改变,可以确定系统已经重启
参考
https://blog.csdn.net/zl18310999566/article/details/103235490
https://blog.csdn.net/sinat_28371057/article/details/113012361