supervisor
使用Python编写的进程管理程序supervisor来管理Python程序那是最合适不过了,supervisor基于CS架构,主要有以下两个组成部分:
- supervisord:supervisord是supervisor的服务端程序。负责启动子程序,应答客户端命令,子程序日志记录,对进程变化发送事件通知等
- supervisorctl: 客户端命令行工具,可以连接服务器端,进行进程的启动、关闭、重启、状态查看等。重要的一点是,supervisorctl不仅可以连接到本机上的supervisord,还可以连接到远程的supervisord,当然在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的。supervisorctl和supervisord之间的通信,是通过xml_rpc完成的。 相应的配置在[supervisorctl]块里面
安装
基于ubuntu16.04,不同linux发行版均可使用包管理器进行安装,也可以使用源码安装和pip安装
pip安装方法
当前最新版本3.3.3,supervisord.conf 和supervisord.d文件夹已自动生成在/etc/supervisor/目录下。可以使用echo_supervisord_conf命令将配置信息重定向到制定目录,比如/etc
服务端启动
查看supervisord是否在运行
supervisord.conf详解
使用echo_supervisord_conf查看supervisord.conf可选的配置项:
详情如下
提取supervisord.conf模板
采用supervisord.conf和program.conf分离的方式进行本机进程管理,从默认配置中抽取出常用的supervisord模板
模板抽取基于以下考虑
- 必填选项不可少
- 服务端支持本地supervisorctl客户端连接也支持远程连接
- 测试环境日志级别设置为debug,生产环境日志级别设置为info,修改loglevel字段即可
- 日志文件大小和个数需要参考服务端所在机器的磁盘大小,会产生stderr和stdout两种日志
- pid文件和log文件都不建议存放在/tmp下面,容易被误删除,因此放在var目录下
提取program.conf模板
从默认配置中抽取出常用的program模板
如果单独调整program日志大小和个数,则加入stdout和stderr四个参数,新的配置文件如下
一般情况下,不需要指定日志文件名称,默认的日志文件名称组成为
- 程序名称+日志类型(stdout和stderr)+ supervisor+进程号+日志编号
文件名称示例:concurrency_statistician-stderr—supervisor-OpZ5di.log.2
需要注意:supervisor服务端程序supervisord重新启动之后,会产生新的pid。因此日志只会在新的进程日志中产生,老的子进程日志不会被删除。因此如果需要重新启动supervisord,则需要注意是否要保留老进程日志,以免超过磁盘大小。
一般情况下,生产环境中不会经常重启supervisord
常用supervisorctl命令
可以进入 supervisorctl 的 shell 界面,也可以直接在 bash 终端运行
关于program groups的命令使用较少暂不介绍
参考资料:
- supervisor 官方文档
- 小强斋太-Supervisor简介、安装、配置
- 使用supervisor管理进程
- 廖雪峰-Linux后台进程管理利器:supervisor
- 乌龟运维-Supervisor 安装及配置
- oschina-SUPERVISOR进程管理器配置指南