Python-进程管理Supervisord

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/y472360651/article/details/78034478

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一样的管理功能。

安装

apt-get 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 ; 程序异常退出后自动重启
environment=LANG="en_US.utf8", LC_ALL="en_US.UTF-8", LC_LANG="en_US.UTF-8"  ; 设置环境变量,此为指定unicode编码,对于读取中文名称的路径文件将会报错,此为supervisor的bug
startsecs=5 ; 启动5s后没有异常退出,就当作已经正常启动了
startretries=3 ; 重启失败自动重试次数,默认为3
user=ubuntu
priority=100 ; 优先级设置。低优先级会先启动,后关闭。
numprocs=2 ; 使用进程组
numprocs_start=2 ; 进程组的数从2开始计数,因为numprocs是2,也就是使用23,如果不指定则是01
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即可

猜你喜欢

转载自blog.csdn.net/y472360651/article/details/78034478
今日推荐