Supervisord是一个用Python实现的进程管理工具,可以很方便地启动、重启、关闭、查看进程(不仅仅是Python进程)。除了对单个进程的控制,它还可以同时操作多个进程。除此之外它还能监控进程,当进程由于某种原因崩溃或者误操作杀掉后,自动重启并发送事件通知。
特征
- 简单:Supervisord通过简单的INI风格的配置文件进行配置,易于学习。它提供了许多每个进程选项,使您的生活更轻松,如重新启动失败的进程和自动日志轮换
- 集中:Supervisord为您提供一个开始、停止和监控流程的地方。过程可以单独或分组控制。您可以配置Supervisor以提供本地或远程命令行和Web页面
- 高效:Supervisord通过fork/exec启动其子进程,子进程不在后台运行。操作系统在进程终止时立即发送信号给Supervisord,而不像一些依赖
- 拓展:Supervisord有一个简单的事件通知协议,用任何语言编写的程序都可以用来监视它,还有一个用于控制XML_RPC的接口,它还可以由Python开发者利用的扩展点构建
- 兼容:Supervisord可以工作在除Windows以外的任何地方,它在Linux、Mac OS X,Solaris和FreeBSD上进行了测试和支持。它完全用Python编写,因此安装不需要C编译器。
- 久经考验:虽然Supervisord今天非常积极的开发,但并不是新的软件。Supervisord已经存在多年,并在许多服务器上使用。
Supervisord组件
Supervisord包含如下4种组件:
- Supervisord:服务端程序,它的主要功能是启动Supervisord服务及其管理的子进程,记录日志、重启崩溃的进程等。
- Supervisorctl:命令行客户端程序,它提供一个类似Shell的接口,通过UNIX域套接字或者TCP/IP套接字使用XML_RPC协议与Supervisord进程进行数据通信。它的主要功能就是管理(启动、关闭、重启、查看状态等)子进程
- Web Server:实现了在界面上管理进程,还能查看进程日志和清除日志。Web Server其实是通过XML_RPC来实现的,可以向Supervisord请求数据。它配置在[inet_http_server]块里面。
- XML_RPC接口:可以通过XML_RPC协议对Web Server进行远程调用,达到和Supervisord以及Web Server一样的管理功能。
安装
pip install supervisor
Supervisor安装完成后,运行echo_supervisord_conf,将打印一个示例Supervisor配置文件到您的终端。
或者输出到指定文件
echo_supervisord_conf > /etc/supervisord.conf
supervisord.conf基本配置
[unix_http_server]
file = /tmp/supervisor.sock ; 监听HTTP/XML_RPC请求。
[supervisord]
logfile = /var/log/supervisord/supervisord.log ; 日志文件
logfile_maxbytes = 50MB ; 日志文件大小限制,超过会切分,设置为0标识不限制
logfile_backups = 20 ; 切分后的日志保留的分数
loglevel = error ; 日志级别,其他可选项为info,debug,warn,trace
pidfile = /var/run/supervisord.pid ;
nodaemon = false ; 使用daemon的方式启动
minfds = 1024 ; 可以打开的文件描述符的最小值
user = ubuntu ;启动supervisord进程使用的用户,虽然默认就是当前用户,但是指定user是一个好习惯
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl = unix:///tmp/supervisor.sock ; 使用UNIX域套接字的方式,文件路径必须和unix_http_server里面的设定匹配
prompt = web_develop ; 定义提示文本,常用来区分不同的环境。使用清晰的提示能减少操作出错
[include]
files = /etc/supervisor/conf.d/*.conf
在conf.d下创建test.conf配置文件
[program:test]
command = gunicorn manager:app -b 0.0.0.0:8000 ; 启动命令
autostart = true ; 在Supervisord启动的时候也自动启动
autorestart = true ; 程序异常退出后自动重启
startsecs = 5 ; 启动5s后没有异常退出,就当作已经正常启动了
startretries = 3 ; 重启失败自动重试次数,默认为3次
user = ubuntu
priority = 100 ; 优先级设置。低优先级会先启动,后关闭。
numprocs = 2 ; 使用进程组
numprocs_start = 2 ; 进程组的数从2开始计数,因为numprocs是2,也就是使用2和3,如果不指定则是0,1
process_name = 1121%(process_num)s ; 当numprocs>1进程名字就需要带process_num变量
redirect_stderr = true ; 把错误日志重定向到输出的日志中。
stdout_logfile = /var/log/supervisord/demo.log ; 指定输出的日志的文件路径
directory = %(ENV_HOME)s/project_directory ; 启动时会先切换目录进来,保证启动的时候的相对路径正确性
stdout_logfile_maxbytes = 200MB ; 输出日志文件大小限制,超过会切分。设置为0表示不限制
stopasgroup = false ;如果设置为true,当进程收到stop信号时,会自动将该信号发给该进程的子进程
killasgroup = false ; 如果设置为true,当进程收到kill信号时,会自动将该信号发给该进程的子进程
ENV_HOME是Supervisor内置的变量旨意,标识当前用户的家目录。
上面的例子的command都是运行在系统环境中,如果要运行在虚拟环境中,可以使用如下方法:
- 把program项中的command改成完整路径:
[program:test]
command = %(ENV_HOME)s/project_directory/venv/bin/gunicorn manager:app -b 0.0.0.0:8000 ; 启动命令
supervisord.conf存放位置
- /usr/local/etc/supervisord.conf
- /usr/local/supervisord.conf
- supervisord.conf
- etc/supervisord.conf
- /etc/supervisord.conf
- /etc/supervisor/supervisord.conf
Supervisord服务端管理
- 启动Supervisord
supervisord
- 停止Supervisord
supervisorctl shutdown
- 重新加载配置文件
supervisorctl reload
进程管理
- 启动所有进程
supervisorctl start all
- 停止所有进程
supervisorctl stop all
- 启动特定的进程
supervisorctl start xx # xx为进程名称,即[program:xx],xx为进程名称
- 停止特定的进程
supervisorctl stop xx
- 查看所有进程状态
supervisorctl status
常见问题
在使用命令supervisorctl -c /etc/supervisor/supervisord.conf启动控制进程时,遇到如下错误
unix:///tmp/supervisor.sock no such file
出现上述错误的原因是supervisord并未启动,只要在命令行中使用命令sudo supervisord启动supervisord即可