Supervisor的简单教程

Supervisor 是一个客户端/服务器系统,允许用户控制类 UNIX 操作系统上的多个进程,能将一个普通的命令行进程变为后台daemon,并监控进程状态,当进程中断时也可以重新启动,在python开发中比较常见。

官网地址:http://supervisord.org/

介绍

优点

官网上列举的优点有:

  • 简单:可通过简单易学的 INI 样式配置文件进行配置
  • 集中:提供了一个启动、停止和监控进程的地方。可以单独或成组控制进程。
  • 高效:Supervisor 通过 fork/exec 启动其子进程,子进程不作为守护进程。进程终止时,操作系统会立即向 Supervisor 发出信号,而不像某些解决方案那样依赖麻烦的 PID 文件和定期轮询来重新启动失败的进程。
  • 可扩展:Supervisor 有一个简单的事件通知协议,任何语言编写的程序都可以使用它来监控它,还有一个 XML-RPC 接口用于控制。它还内置了可供 Python 开发人员利用的扩展点。
  • 兼容的:Supervisor 几乎可以在除 Windows 之外的所有平台上运行(这个就很尴尬,windows server不行也能叫兼容吗?)
  • 可靠的:存在多年,并且已在许多服务器上使用

两个组件

supervisordsupervisorctlsupervisor 工具中的两个主要组件

  • supervisord 是 Supervisor 的服务器部分,负责启动、管理和监控所有由其配置的子进程。还可以记录其子进程stdoutstderr 输出,以及生成和处理与子进程生命周期中的点相对应的"事件"。
  • supervisorctl 是一个命令行客户端,用于与 supervisord 交互。它提供了一个类似shell的界面,用户可以连接到不同的 supervisord进程

安装与运行

因为不支持在windows上运行,我这里用了wsl(用其他的虚拟环境也可以)

  1. 搭建python的虚拟环境和安装对应的包
shell 复制代码
python3 -m venv venv
source venv/bin/activate
pip install -i https://mirrors.aliyun.com/pypi/simple --upgrade pip
pip install -i https://mirrors.aliyun.com/pypi/simple --upgrade setuptools
pip install -i https://mirrors.aliyun.com/pypi/simple supervisor
  1. 导出配置
shell 复制代码
venv/bin/echo_supervisord_conf > supervisord.conf
  1. 修改配置(在启动之前,我们至少要添加一个程序配置)
shell 复制代码
vim supervisord.conf
ini 复制代码
[program:foo]
command=/bin/cat
  1. 运行:supervisord -c supervisord.conf -n,如果看到success就可以了

这里的命令行选项含义是:

-c FILE, --configuration=FILE:Supervisord配置文件的路径。

-n, --nodaemon:在前台运行supervisord 。

  1. 使用supervisorctl确认下状态:venv/bin/supervisorctl status all,如果看到RUNNING,说明配置中的foo程序就在运行了

可以使用"一次性"命令调用 supervisorctl 可执行文件,像我上面写的venv/bin/supervisorctl status all

也可以进入控制台,venv/bin/supervisorctl然后再执行status all

  1. 结束:Ctrl + C就行,假如是后台运行的话,可以这样结束运行
shell 复制代码
ps aux | grep supervisord
sudo pkill supervisord

配置篇

上面的演示使用的是导出的配置,真正实战肯定是要用自定义的配置,方便管理。我这里给比较常见的配置注释了,更具体的最好还是去官网查阅

ini 复制代码
[unix_http_server]
file=/tmp/supervisor.sock   ; 套接字文件,只有在supervisor运行时候才会创建,它将允许本地的 supervisorctl 或其他工具通过套接字文件与 supervisord 通信。
chmod=0700                 ; 套接字文件的权限(这也是默认值,仅限所有者读写)
username=user         ; 需要身份验证时的用户名,这样使用 supervisorctl 需要输入用户名和密码
password=pass         ; 需要身份验证时的密码

[supervisord]
logfile=/tmp/supervisord.log ;  定义 supervisord 的日志文件路径。
logfile_maxbytes=50MB        ; 设置日志文件的最大大小。
logfile_backups=10           ; 会保留最近 10 个轮转的日志文件,超过数量的旧日志将被删除。
loglevel=info                ; 日志记录级别; 其他的有debug,warn,trace等
pidfile=/tmp/supervisord.pid ; PID 文件记录 supervisord 进程的 ID,方便后续管理(如停止、重启)。
nodaemon=false               ; 设置 supervisord 是否以守护进程(daemon)模式运行。
silent=false                 ; 定义 supervisord 是否在非守护模式下隐藏输出,false:输出日志到控制台(适合调试)。
minfds=1024                  ; 定义 supervisord 管理的最小文件描述符数量(在 Linux/Unix 系统中,文件描述符是进程与内核之间通信的桥梁,感兴趣可以了解下,这里就用默认配置)
minprocs=200                 ; 定义 supervisord 管理的最小进程数

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface ; 基础配置,必须保留,创建并注册主 RPC 接口

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;用来访问 Supervisord 服务器的 URL,和上面的 unix_http_server 部分的 file 选项对应。

[program:celery]
command=celery -A celery_app worker --loglevel=INFO --logfile=/root/supervisor/log/worker.log  ;启用celery
autostart=true  ;设置 Supervisor 在启动时是否自动启动该程序。
autorestart=true  ; 如果程序异常退出,是否自动重启。
restartsecs=5  ;重启前的等待时间(秒)
startretries=3  ;启动失败时,Supervisor 重试次数。

; 日志配置:标准输出(stdout)和标准错误(stderr)日志
stderr_logfile=/root/supervisor/log/celery_worker.err.log
stderr_logfile_maxbytes=10MB
stderr_logfile_backups=3

stdout_logfile=/root/supervisor/log/celery_worker.out.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=3
  • 注意,我这里给unix_http_server设置了用户和密码,这样使用supervisorctl工具时需要输入密码了

  • 设置重启时,一定要注意,如果这个命令会占用资源/消耗大量cpu,那么反复重启可能会有比较严重的后果

supervisorctl 操作篇

查看进程

  • status celery :status可以查看进程的状态,如果后面接all,就是查看所有的进程
  • 直接输入help可以查看所有命令,其实大部分命令的含义可以直观理解的

新增进程

  • 修改配置,我在配置中增加了一段
ini 复制代码
[program:foo]
command=/bin/cat
  • supervisorctl的控制台中依次执行以下命令,就可以看到foo进程执行了
shell 复制代码
reread
update
status all
  • 修改配置也是类似操作

停止进程

  • status foo:停止foo这个进程,停止后再次查看状态,会有如下显示

    foo STOPPED Dec 13 06:07 PM

启动进程

  • start foo:启动foo这个进程
  • restart foo:重新启动foo这个进程

移除进程

  • remove foo:移除foo这个进程
  • 注意,这里并没有把配置中的foo删除,再次reread仍然可以读到配置
相关推荐
程序员小远3 分钟前
如何使用Postman做接口自动化测试?
python·功能测试·测试工具·职场和发展·测试用例·postman·持续集成
Maki Winster8 分钟前
将收藏夹变为静态网页,本地用可以当浏览器首页
python·html5·edge浏览器
jingling55521 分钟前
adb常用指令(完整版)
数据库·人工智能·python·adb·语音识别
静心问道31 分钟前
DEBERTA:具有解耦注意力机制的解码增强型BERT
人工智能·python
深图智能2 小时前
PyTorch使用教程(9)-使用profiler进行模型性能分析
人工智能·pytorch·python·深度学习
凌小添3 小时前
Python入门教程丨2.3 流程控制、算法效率分析及优化
python·算法
fyhs3 小时前
mayavi -> python 3D可视化工具Mayavi的安装
python·数据可视化·mayavi
wit_@3 小时前
【深入解析】 RNN 算法:原理、应用与实现
python·rnn·深度学习·神经网络
m0_748254664 小时前
Python中的简单爬虫
爬虫·python·信息可视化