进程管理工具Supervisor(一)简介与使用
Supervisor是用Python开发的一套client/server架构的进程管理程序,能做到开机启动,以daemon进程的方式运行程序,并可以监控进程状态等等。
linux进程管理方式有传统的rc.d、新兴的upstart、systemd等,与这些相比,Supervisor有着自己的特点。
便利性
使用rc.d管理进程的时候,一是要写耗时耗力的脚本,二是管理的进程挂掉的话不会自动重启。
而supervisor要启动子进程,只需要将子进程的启动命令写入配置文件即可,配置自动重启子进程也很方便。
精确
supervisor作为父进程监控子进程,得到的子进程状态是很准确的。
授权
一般要管理linux进程的话,特别是在一些“low" tcp端口,比如1024以下端口中运行的程序,都需要root权限。
而以root权限启动supervisord后,一般的用户可以在一个简单的shell或者web界面中获取supervisord控制的子进程运行状态,并通过stop、start、restart的命令控制子进程的运行。
进程组
supervisor可以对子进程以start all或者restart all命令的方式进行统一管理。
中央集中式管理
supervisor可以在同一个地方启动、停止或者监视管理的进程。既可以单独的控制一个进程,也可以一起控制一组进程。
管理的时候,既可以本地管理,又可以远程连接,提供命令行接口与web页面接口。
高效性
supervisor是通过fork/exec的方式启动子进程的,子进程挂掉的话,操作系统会立即通知supervisor。
兼容性
除了windows,其他操作系统平台都可运行supervisor。supervisor使用python编写,不需要c编译器。
组件
supervisord
supervisor的服务器端,负责启动子程序,响应客户端发来的命令,重启子程序,记录子程序stdout和stderr的日志,处理Event。
配置文件一般是名为/etc/supervisord.conf的ini文件。
supervisorctl
supervisor的命令行客户端,提供一个类shell接口,用户可以使用supervisorctl连接不同的supervisord进程,查看子进程状态,start、stop子进程,获取控制的子进程列表。
客户端可以使用unix socket或者tcp socket与服务端进行通讯,通过配置文件中的[supervisorctl]段进行配置。
Web Server
使用tcp socket启动supervisord的时候,提供的一个访问supervisor的web接口。
url地址通过配置文件中的[inet_http_server]进行设置。
XML-RPC Interface
一个XML-RPC接口
下载
可以使用setuptools或者pip下载:
1 2 3 | easy_install supervisor or pip install supervisor |
ubuntu中使用apt下载:
1 | apt - get install supervisor |
配置文件
运行echo_supervisord_conf命令可以在shell中显示一份supervisor配置文件样本。配置一般是放在文件/etc/supervisord.conf的,所以可以将配置输入到配置文件中:
1 | echo_supervisord_conf > / etc / supervisord.conf |
上述命令需要root权限,如果没有权限或者想另置配置文件地址,可以在当前目录生成:
1 | echo_supervisord_conf > supervisord.conf |
然后启动时使用-c选项指定配置文件即可:
1 | supervisord - c supervisord.conf |
启动
首先配置要启动的子进程,可以在supervisord.conf中配置,也可以单独配置,supervisord.conf中的include配置:
1 2 | [include] files = / etc / supervisor / conf.d / * .conf |
所以可以在/etc/supervisor/conf.d/目录下,以.conf作为扩展名为子进程建立单独的配置文件,比如建立一个foo.conf文件:
1 2 | [program:foo] command = / bin / cat |
上述是最简单的配置了,foo为子进程名称,command是子进程运行命令。
重启supervisor使配置生效:
1 | service supervisor restart |
或者直接执行启动supervisord:
1 | $BINDIR / supervisord |
启动foo子进程:
1 | supervisorctl start foo |
一个实际例子,启动celery beat服务,建立celerybeat.conf文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = ; celery beat supervisor example ; = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = [program:celerybeat] ; Set full path to celery program if using virtualenv command = celery beat - A myapp - - schedule / var / lib / celery / beat.db - - loglevel = INFO ; remove the - A myapp argument if you aren't using an app instance directory = / path / to / project user = nobody numprocs = 1 stdout_logfile = / var / log / celery / beat.log stderr_logfile = / var / log / celery / beat.log autostart = true autorestart = true startsecs = 10 ; Causes supervisor to send the termination signal (SIGTERM) to the whole process group. stopasgroup = true ; if rabbitmq is supervised, set its priority higher ; so it starts first priority = 999 |
启动:
1 2 | $ supervisorctl start celerybeat celerybeat: started |
celery beat服务开始运行了:
1 2 3 4 5 6 7 8 | [ 2017 - 12 - 22 07 : 13 : 47 , 904 : WARNING / ForkPoolWorker - 1 ] 32 [ 2017 - 12 - 22 07 : 13 : 47 , 908 : INFO / ForkPoolWorker - 1 ] Task tests.tasks.add[ 77706e41 - 83c1 - 4545 - 922b - b77a57205ef5] succeeded in 0.00359446300718s : None [ 2017 - 12 - 22 07 : 13 : 57 , 903 : INFO / MainProcess] Received task: tests.tasks.add[ 3f9c7c88 - 61aa - 44cc - a517 - 14f32305ad64 ] [ 2017 - 12 - 22 07 : 13 : 57 , 907 : WARNING / ForkPoolWorker - 1 ] 32 [ 2017 - 12 - 22 07 : 13 : 57 , 910 : INFO / ForkPoolWorker - 1 ] Task tests.tasks.add[ 3f9c7c88 - 61aa - 44cc - a517 - 14f32305ad64 ] succeeded in 0.00268728499941s : None [ 2017 - 12 - 22 07 : 14 : 07 , 903 : INFO / MainProcess] Received task: tests.tasks.add[ 90e4277b - 7041 - 4c3a - 905c - 1a5e16272d31 ] [ 2017 - 12 - 22 07 : 14 : 07 , 907 : WARNING / ForkPoolWorker - 1 ] 32 [ 2017 - 12 - 22 07 : 14 : 07 , 910 : INFO / ForkPoolWorker - 1 ] Task tests.tasks.add[ 90e4277b - 7041 - 4c3a - 905c - 1a5e16272d31 ] succeeded in 0.0029478570068s : None |
配置不正确的话,会报supervisor ERROR (spawn error)错误,可以使用tail命令看下错误日志:
1 | supervisorctl tail celerybeat stdout |
查看管理的子进程运行状态:
1 2 | $ supervisorctl status celerybeat RUNNING pid 66802 , uptime 0 : 12 : 59 |
关闭子进程:
1 | supervisorctl stop celerybeat |
不加参数的直接运行supervisorctl命令,会进入supervisor客户端的交互终端进行操作。
要通过web页面访问supervisor,可以添加以下配置:
1 2 3 4 | [inet_http_server] port = 127.0 . 0.1 : 9001 username = username password = yourpwd |
浏览器访问127.0.0.1:9001,输入配置的用户名、密码,进入页面:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探