kaixin
Published on 2023-11-15 / 21 Visits
0

supervisor进程管理工具

supervisor

是什么:

  • Supervisor 是一个用 Python 编写的进程监控工具,它可以帮助用户管理、监控和控制各种进程。通过 Supervisor,用户可以轻松地启动、停止、重启和管理多个进程,并在这些进程意外终止时进行自动恢复。Supervisor 提供了一个便捷的方式来管理系统中运行的各种任务和服务,确保它们始终处于可靠的状态。

作用:

  1. 进程监控:监控各个进程的状态,并在需要时进行重启。
  2. 进程控制:启动、停止、重启单个或多个进程。
  3. 日志管理:记录各个进程的输出日志,方便用户查看和分析。
  4. 配置管理:通过配置文件定义需要监控的进程及相关参数。
  5. Web 界面:提供 Web 界面来方便用户查看和管理进程状态。

场景:

  1. 在 Web 服务器(如 Nginx、Apache)或应用服务器(如 Gunicorn、Unicorn)崩溃时,Supervisor 可以自动重启它们,在高并发请求时,可以使用它进行管理多个进程实例,提高性能
  2. 管理一些比如,队列进程,redis queue工作进程,使后台更为稳定,定期执行的批量任务可以使用它进行管理,实现任务失败,重新执行。
  3. 确保 Redis 或 Memcached 等缓存服务始终运行,并在意外停止时自动重启,管理数据库代理服务,如 PgBouncer 或 HAProxy,确保数据库连接的稳定性。
  4. 对jenkins和gitlab 进行管理保证构建与部署管道正常,监控工具,zabbix或者prometheus或者是日志收集工具(如 Fluentd、Logstash)确保监控工具与日志收集工具正常运行。
  5. 可以管理单个容器的多个进程,在某个条件下,一个容器可以用多个进程,那使用它就可以管理这个进程,在复杂的 Docker Compose 配置中,Supervisor 可以帮助管理多个容器内进程,简化运维操作。
  6. 服务发现和注册 确保微服务注册工具(如 Consul、Eureka)始终运行,保障服务发现功能的稳定性,管理 API 网关(如 Kong、Traefik),确保请求路由和负载均衡的可靠性。
  7. 本地开发过程中,使用 Supervisor 管理开发服务器和相关服务,简化启动和管理。在自动化测试环境中,确保各个测试服务始终处于运行状态。

1.安装

# 官方文档:
    https://supervisord.org/configuration.html

yum install supervisor # centos
apt install supervisor # ubuntu 

# 命令行工具
    /usr/bin/supervisorctl 
# 启动程序。如果使用yum或者apt等方式安装均可以使用systemctl管理工具管理
    /usr/bin/supervisord 

/etc/supervisord.conf # 它的配置文件,可以进行,/etc/supervisord/supervisord.conf 
/etc/supervisord.d/ # 自配置文件所在的位置,将管理进程的文件在这里



systemctl enable supervisor # 设置开机自启
systemctl start supervisor # 启动
supervisord -c /etc/supervisor/supervisord.conf -n # 调试模式

2.配置说明

# 套接字的配置区域
[unix_http_server]
file=/tmp/supervisor.sock   # socker文件所在位置
chmod=0700                 # socker文件默认权限
chown=nobody:nogroup       # socker使用的用户组与用户
# 仅适用于通过 Unix 套接字 进行通信的客户端,与inet_http_server字段参数不是同一个
username=user
password=123

# 网络服务器web端
[inet_http_server]        
port=127.0.0.1:9001        # 端口地址
# 适用于通过 网络(TCP/IP) 连接的客户端
username=user            
password=123             

# supervisor服务端配置
[supervisord]
# 日志相关配置
logfile=/var/log/supervisor/supervisord.log  # 日志所在位置
logfile_maxbytes=50MB       # 日志最大50MB,到达后进行产生新的日志文件
logfile_backups=10          # 保存的备份数量
loglevel=info               # 日志的级别 critical 、 error 、 warn 、 info 、 debug 、 trace
silent=false			   # 控制日志的输出方式,true不将输出到控制台或者日志文件,false日志信息输出到控制台或日志文件中
strip_ansi=false           # 控制是否从子进程的日志输出中去除 ANSI 转义码。

# 进程相关配置
pidfile=/var/run/supervisord.pid # pid所在的文件
umask=022                  # 进程文件创建的遮罩码
nodaemon=false             # 进程的运行方式,是前台还是后台(docker需要前台)
identifier=supervisor      # 该管理进程的标识符字符串,由 RPC 接口使用,通过标识符号进行区分操作的实例。
directory=/tmp             # 指定 Supervisor 或程序运行时的工作目录。
childlogdir=/tmp           # 指定子进程的日志文件存放目录。
nocleanup=true             # 指示 Supervisor 是否在启动时清理其子进程的日志文件。

# 文件相关
minfds=1024                 # 使用最小的文件描述符数量
minprocs=200                # 进程描述符的最小数量

# 环境变量
environment=KEY1="value1",KEY2="value2"     # 为程序设置环境变量,启动进程时传递特定环境变量

# 用户相关
user=chrism                # 以哪个用户来管理supervisor的子进程
# 注意:
    修改为普通用户的情况下,需要修改日志的访问权限,socket访问权限,配置文件的访问权限,不然无法启动。
    一般报错:权限不足或者是无法打开HTTP服务器:socket.Error报告错误都是权限的问题。




# supervisorctl命令行工具配置
[supervisorctl]
# 链接方式
serverurl=unix:///var/run/supervisor/supervisor.sock # 链接socket文件
serverurl=http://127.0.0.1:9001 # 或者连接的web端地址

# 链接的账户密码
username=chris              # 使用它们的账户
password=123                # 使用它们设置及密码

prompt=mysupervisor         # 用作supervisorctl提示符的字符串。
history_file=~/.sc_history  # 记录你输入的supervisorctl命令记录保存路径


[include]
files = supervisord.d/*.conf  # 读取设置应用管程序配置文件,可以添加多个用空格分开

3.应用程序配置

# 需要再指定的 include 设置的目录下创建应用程序目录 *.ini
# 每个需要由 Supervisor 管理的程序在配置文件中都有一个 [program:x] 段,其中 x 是该程序的名称
[program:myprogram] # 管理程序的关键字[program:管理程序的名称]
command=/path/to/my/program --arg=value   ; 启动命令
process_name=%(program_name)s             ; 进程名称
numprocs=1                                ; 启动进程数量
directory=/path/to/working/dir            ; 工作目录
autostart=true                            ; 自动启动
autorestart=true                          ; 自动重启
startsecs=10                              ; 启动后等待时间(秒)
startretries=3                            ; 启动失败重试次数
exitcodes=0,2                             ; 正常退出返回码
stopsignal=TERM                           ; 停止信号
stopwaitsecs=10                           ; 停止等待时间
user=myuser                               ; 运行用户
redirect_stderr=true                      ; 重定向 stderr 到 stdout
stdout_logfile=/var/log/myprogram.log     ; stdout 日志文件
stdout_logfile_maxbytes=20MB              ; stdout 日志文件最大尺寸
stdout_logfile_backups=10                 ; stdout 日志文件保留数量
stderr_logfile=/var/log/myprogram_err.log ; stderr 日志文件
stderr_logfile_maxbytes=20MB              ; stderr 日志文件最大尺寸
stderr_logfile_backups=10                 ; stderr 日志文件保留数量
environment=A="1",B="2"                   ; 环境变量
priority=999                              ; 启动优先级

3-1.管理一个flask配置

[program:flask]
command=/usr/bin/python2  /opt/app.py # 启动命令
autostart=true # 自动启动
autorestart=true  # 自动重启
startsecs=5 # 启动后等待几秒
redirect_stderr=true # 重定向 stderr 到 stdout
stdout_logfile_maxbytes=20MB # 日志大小
stdout_logfile_backups=20 # 日志保存最大数量
stdout_logfile=/var/log/supervisor/flask.log # 日志存储的位置

3-2.管理一个nginx配置

[program:nginx]
command=/bin/nginx -g 'daemon off;' # 启动命令
autostart=true # 自动启动
autorestart=true # 自动重启
startsecs=5 # 启动后等待几秒
redirect_stderr=true # 重定向 stderr 到 stdout
stdout_logfile_maxbytes=20MB # 日志大小
stdout_logfile_backups=20 # 日志保存最大数量
stdout_logfile=/var/log/supervisor/nginx.log # 日志存储的位置

4.supervisorctl名称

# 注意:
    如果使用supervisorctl管理命令需要配置对应的配置才能使用。
    
supervisorctl # 进入命令行交互界面,可直接输入子命令进行管理。

# 常用的命令
    supervisorctl reload #  重新加载配置文件,并重启supervisord及所有自动启动的程序。
    supervisorctl restart {PROGRAM< ...>}|all # 重启指定程序,all表示重启所有程序。
    supervisorctl start {PROGRAM< ...>}|all # 启动指定程序,all表示启动所有程序。
    supervisorctl status <{PROGRAM< ...>}|all # 看指定程序状态,如为all或不指定则查看所有程序状态。
    supervisorctl stop {PROGRAM< ...>}|all # 停止指定程序,all表示停止所有程序。
    supervisorctl update # 重新加载配置文件,并启动新配置指定的程序。


# 使用supervisor 管理进程,只能有supervisor来关闭,如果直接关闭管理的进程,时会被重启的

5.测试使用

5-1.编写脚本程序

from flask import Flask
app=Flask(__name__)
@app.route('/')
def hello():
    return "测试测试...."
if __name__=="__main__":
    app.run(host='0.0.0.0',port=8000)

5-2.supervisor修改配置

/etc/supervisor/supervisor.conf
# 添加配置
[inet_http_server]        
port=:9001      
username=user            
password=123   
  
[supervisorctl]
serverurl=http://127.0.0.1:9001
username=user
password=123
prompt=xxxxx
history_file=~/.sc_history

image-20250309233854316


5-3.编写进程管理脚本配置

/etc/supervisor//conf.d/flask.conf
[program:flask]
command=/usr/bin/python3.12  /opt/app.py
autostart=true 
autorestart=true 
startsecs=5 
redirect_stderr=true
stdout_logfile_maxbytes=20MB 
stdout_logfile_backups=20
stdout_logfile=/var/log/supervisor/flask.log 

image-20250309234058316


5-4.启动程序查看

1.启动程序
    sudo systemctl start supervisor # 启动 
    systemctl restart  supervisor  # 重启服务
    supervisorctl reload # 重新读取配置文件

2.查看配置ui页面信息
    192.168.85.135:9001
    
3.使用命令行进行查看
    supervisorctl status 
    supervisorctl status flask

image-20250309235915072


5-5.关停测试

1.关闭当前执行进程
    supervisorctl status flask # 获取进程号
    kill 1311

2.在进行查看
    supervisorctl status flask

image-20250310000126205