supervisor详解-苏坡外泽

文档地址

  1. 官网:http://supervisord.org/
  2. RD文档:https://www.rddoc.com/doc/Supervisor/3.3.1/zh/

简介

supervisor是一个客户端/服务器系统,是一个python开发的进程管理程序,允许其他用户在类unix操作系统上监视和控制多个进程。用于控制与项目或客户相关的过程,以为这在启动时像任何其他程序一样启动

  1. 特征:简单、集中、高效、可扩展、兼容(完全由python编写,不需安装C编译器,适用于windows之外的一切)
  2. supervisor组件
  • supervisord:服务部分,负责在自己的调用中启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdout和stderr输出,以及生成和处理对应于子进程生命周期中的点的时间,配置文件路径/etc/supervisor/supervisord.conf
  • supervisorctl:命令行客户端
    • 为supervisord提供的功能提供了一个shell样界面,从supervisorctl用户可以连接到不同的supervisor进程,在由子进程控制的子进程上获取状态,停止和启动子进程,并获取supervisord的运行进程列表。
    • 命令行客户端通过unix域套接字或TCP套接字与服务器通信
  • 网络服务器:访问服务器URL(例如 http://localhost:9001/),以在激活配置文件的 [inet_http_server] 部分后通过Web界面查看和控制进程状态。
  • XML-RPC接口:用户询问和控制管理程序及其运行的程序
  1. 平台要求:支持linux(ubuntu),Mac OS X,Solaris 和FreeBSD,不支持任何版本的windows,可在python2.4或更高版本工作,不支持python3

安装

  1. ubuntu安装 :sudo apt-get install supervisor
  2. centos安装 :sudo yum install supervisor
  3. pip形式安装:pip install supervisor
  4. easy_install安装:easy_install supervisor
  5. 配置文件地址:/etc/supervisor/supervisord.conf

运行

  1. /usr/bin/python2 /usr/bin/supervisord -c /etc/supervisor/supervisord.conf # 第一次启动
  2. 添加程序,最简单的添加程序可直接编辑supervisord.conf,新增如下配置
    [program:foo]
    command=/bin/cat
    
  3. supervisord命令选项说明:superviord
  • -c FILE | --configuration=FILE 配置文件
  • -n | -- 前台运行
  • -u USER | --user=USER 执行命令的用户身份
  • -e LEVEL|--loglevel=LEVEL 日志记录级别
  • -v|--version 查看版本
  • -h|--help 查看帮助
  • …详见官方文档
  1. supervisorctl命令选项说明:supervisorctl
  • -c FILE | --configuration=FILE 配置文件
  • -v|--version 查看版本
  • -h|--help 查看帮助
  • -s|--serverurl URL 超级服务器侦听的url
  • -i | --interactive 执行命令后启动交互shell
  • -u USER | --user=USER 执行命令的用户身份
  • -p PASSWORD | --password=PASSWORD 用于服务器验证身份的密码
  • -r|--history-file 保持阅读历史
  1. 运行supervisorctl
  • 重新读取配置文件:sudo supervisorctl reread
  • 更新:sudo supervisorctl update
  • 进入命令:sudo supervisorctl
  • 停止某任务:sudo supervisorctl stop celery
  • 开启某任务:sudo supervisorctl start celery
  • 重启:sudo supervisorctl restart celery
  • 重启全部:sudo supervisorctl restart all
  • 查看状态:sudo supervisorctl status

配置说明

文件格式

  1. windows-ini的风格,由部分(每个由[header]表示)和部分中的键值对组成
  2. 环境变量:存在于环境中的环境变量可以在配置文件中使用Python字符串表达式语法 %(ENV_X)s
  3. 示例
    [program:example]
    command=/usr/bin/example --loglevel=%(ENV_LOGLEVEL)s
    

[unix_http_server]节配置

[unix_http_server]
file = /tmp/supervisor.sock # 监听的UNIX域套接字路径
chmod = 0777                # 启动时将unix域套接字的权限模式,默认0700
chown = nobody:nogroup      # 将套接字文件的用户和组更改为此值。可以是UNIX用户名(例如 chrism)或用冒号(例如 chrism:wheel)分隔的UNIX用户名和组。默认为使用启动supervisord的用户的用户名和组。
username = user             # 对此HTTP服务器进行身份验证所需的用户名。
password = 123              # 对此HTTP服务器进行身份验证所需的用户名。

[inet_http_server]节配置

[inet_http_server]
port = 127.0.0.1:9001 # 监控器将监听HTTP/XML-RPC请求的端口值,要监听机器中的所有接口,请使用 :9001 或 *:9001
username = user       # 用户名 
password = 123        # 密码

[supervisord]节配置

[supervisord]
logfile = /tmp/supervisord.log            # 日志路径
logfile_maxbytes = 50MB                   # 日志轮转之前可能消耗的最大字节数,为0代表无限日志大小
logfile_backups=10                        # 日志轮换导致的备份数,为0代表不保留备份
loglevel = info                           # 日志级别
pidfile = /tmp/supervisord.pid            # 超级用户保留其pid文件的位置
nodaemon = false                          # 如果为true,supervisord将在前台而不是守护进程启动。默认false
minfds = 1024                             # 在supervisord将成功启动之前必须可用的文件描述符的最小数量,默认1024
minprocs = 200                            # 在supervisord将成功启动之前必须可用的进程描述符的最小数量,默认200
umask = 022                               # 超级过程的 umask。默认022
user = chrism                             # 指示 supervisord 在进行任何有意义的处理之前将用户切换到此UNIX用户帐户,默认不切换用户
identifier = supervisor                   # RPC接口使用的此supervisor进程的标识符字符串,默认supervisor
directory = /tmp                          # 当supervisord 守护进程时,切换到此目录
nocleanup = true                          # 防止supervisord在启动时清除任何现有的 AUTO 子日志文件,默认false
childlogdir = /tmp                        # 用于 AUTO 子日志文件的目录。
strip_ansi = false                        # 从子日志文件中剥离所有ANSI转义序列
environment = KEY1="value1",KEY2="value2" # 将被放置在 supervisord 进程环境中(以及作为其所有子进程的环境的结果)的 KEY="val",KEY2="val2" 形式的键/值对的列表。

[supervisorctl]节配置

[supervisorctl]
serverurl = unix:///tmp/supervisor.sock # 应用于访问超级服务器的URL,例如 http://localhost:9001。对于UNIX域套接字,请使用 unix:///absolute/path/to/file.sock
username = chris                        # 传递到supervisord服务器以用于身份验证的用户名
password = 123                          # 要传递到Supervisord服务器以用于身份验证的密码
prompt = mysupervisor                   # 用作supervisorctl提示符的字符串
history_file = /tmp/his_file.log        # 用作 readline 持久性历史记录文件的路径

[program:x]节配置

重点 and 常用

[program:cat]                 # 名为cat的program配置如下
command=/bin/cat              # 程序启动时的命令
process_name=%(program_name)s # 进程名称
numprocs=1                    # Supervisor将启动由numprocs命名的此程序的许多实例
numprocs_start=0              # 用于计算 numprocs 开始的数字的整数偏移量
directory=/tmp                # 一个文件路径,表示在执行子代之前 supervisord 应暂时chdir的目录。
umask=022                     # 表示进程的umask的八进制数(例如002,022)
priority=999                  # 程序在启动和关闭顺序中的相对优先级。
autostart=true                # 如果为true,则在启动supervisord时,此程序将自动启动,默认为true
autorestart=unexpected        # # 指定如果 supervisord 处于 RUNNING 状态时,如果它退出,则 supervisord 是否应自动重新启动该进程
startsecs=10                  # 启动后,程序需要保持运行以考虑启动成功(将进程从 STARTING 状态移动到 RUNNING 状态)的总秒数
startretries=3                # 在放弃并将过程置于 FATAL 状态之前,尝试启动程序时,supervisord 将允许的串行故障尝试次数
exitcodes=0,2                 # 与 autorestart 一起使用的此程序的“预期”退出代码列表。
stopsignal=TERM               # 请求停止时用于终止程序的信号
stopwaitsecs=10               # 在程序发送一个停止信号后等待操作系统将SIGCHLD返回到 supervisord 的秒数
stopasgroup=false             # 如果为真,则该标志使管理程序向整个进程组发送停止信号,并暗示 killasgroup 为真。
killasgroup=false             # 如果为true,当使用发送SIGKILL到程序终止它发送它到整个进程组,照顾它的孩子,以及有用的,例如使用 multiprocessing 的Python程序。  
user=chrism                   # 指示 supervisord 将此UNIX用户帐户用作运行程序的帐户。
redirect_stderr=false         # 如果为true,则导致进程的stderr输出在其stdout文件描述符上被发送回 supervisord  
stdout_logfile=/a/path        # 将进程stdout输出放在此文件中(如果redirect_stderr为true,还将stderr输出放在此文件中)
stdout_logfile_maxbytes=1MB   # stdout_logfile 在旋转之前可能消耗的最大字节数(可以在值中使用类似“KB”,“MB”和“GB”的后缀乘法器)。将此值设置为0表示无限日志大小
stdout_logfile_backups=10     # 由进程标准输出日志文件轮换产生的 stdout_logfile 备份的数量。如果设置为0,将不保留备份。
stdout_capture_maxbytes=1MB   # 当进程处于“stdout捕获模式”(见 捕获模式)时,写入捕获FIFO的最大字节数,为0,则过程捕获模式将关闭。
stdout_events_enabled=false   # 如果为true,则当进程写入其stdout文件描述符时,将发出PROCESS_LOG_STDOUT事件
stderr_logfile=/a/path        # 将过程stderr输出放在此文件中,除非 redirect_stderr 为true
stderr_logfile_maxbytes=1MB   # stderr_logfile 的日志文件轮换前的最大字节数
stderr_logfile_backups=10     # 由进程stderr日志文件轮换导致的备份数
stderr_capture_maxbytes=1MB   # 当进程处于“stderr捕获模式”(见 捕获模式)时,写入捕获FIFO的最大字节数
stderr_events_enabled=false   # 如果为true,则当进程写入其stderr文件描述符时,将发出PROCESS_LOG_STDERR事件
environment=A="1",B="2"       # 将被放置在子进程的环境中的 KEY="val",KEY2="val2" 形式的键/值对的列表。
serverurl=AUTO                # 在环境中传递到子进程进程的URL作为 SUPERVISOR_SERVER_URL

[include:x]节配置

[include]
files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf # 文件包含

[group:x]节配置

[group:foo]
programs=bar,baz # 以逗号分隔的程序名称列表。列出的程序成为组的成员
priority=999     # 优先级

[fcgi-program:x]节配置

Supervisor可以管理所有在同一套接字上侦听的 FastCGI 进程组。[program:x] 部分可用的所有选项也被 fcgi-program 部分遵守

[fcgi-program:fcgiprogramname]
command=/usr/bin/example.fcgi
socket=unix:///var/run/supervisor/%(program_name)s.sock  # 此程序的套接字
socket_owner=chrism                                      # 指定FastCGI套接字的用户和组
socket_mode=0700
process_name=%(program_name)s_%(process_num)02d
numprocs=5
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=unexpected
startsecs=1
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopasgroup=false
killasgroup=false
stopwaitsecs=10
user=chrism
redirect_stderr=true
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

[eventlistener:x]节配置

Supervisor允许在配置文件中定义专用的同构进程组(“事件监听器池”)

[eventlistener:theeventlistenername]
command=/bin/eventlistener
process_name=%(program_name)s_%(process_num)02d
numprocs=5
events=PROCESS_STATE  # 此侦听器在接收通知时感兴趣的事件类型名称的逗号分隔列表
buffer_size=10        # 事件侦听器池的事件队列缓冲区大小
directory=/tmp
umask=022
priority=-1
autostart=true
autorestart=unexpected
startsecs=1
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
stopasgroup=false
killasgroup=false
user=chrism
redirect_stderr=false
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

[rpcinterface:x]节配置

设置其他自定义行为扩展管理程序,这里做详细介绍

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

错误集锦

  1. error:class 'socket.error' [Errno 2] No such file or directory: file: /usr/lib64/python2.7/socket
    • 第一次启动采用要加载配置文件启动:/usr/bin/python2 /usr/bin/supervisord -c /etc/supervisord.conf

使用示例

接管celery做守护进程:

配置文件如下:/etc/supervisor/conf.d/celery.conf

[program:project-celery]
directory = /home/user/project
command = /home/user/project/venv/bin/celery -A celery_task.tasks worker -l info 
autorestart = true
user = user
redirect_stderr = true
stdout_logfile = /home/tianchi/user/project/logs/supervisor/celery_stdout.log
stderr_logfile = /home/tianchi/user/project/logs/supervisor/celery_stderr.log
loglevel = info

接管python项目做守护进程:

配置文件如下:/etc/supervisor/conf.d/project.conf

[program:project]
directory = /home/user/project
command = /home/user/project/venv/bin/gunicorn -w 4 -b 127.0.0.1:8080 wsgi:app
autorestart = true
user = user
redirect_stderr = true
stdout_logfile = /home/tianchi/user/project/logs/supervisor/stdout.log
stderr_logfile = /home/tianchi/user/project/logs/supervisor/stderr.log
loglevel = info

版权声明:本文为weixin_37008947原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。