文章目录
文档地址
- 官网:http://supervisord.org/
- RD文档:https://www.rddoc.com/doc/Supervisor/3.3.1/zh/
简介
supervisor是一个客户端/服务器系统,是一个python开发的进程管理程序,允许其他用户在类unix操作系统上监视和控制多个进程。用于控制与项目或客户相关的过程,以为这在启动时像任何其他程序一样启动
- 特征:简单、集中、高效、可扩展、兼容(完全由python编写,不需安装C编译器,适用于windows之外的一切)
- supervisor组件
supervisord:服务部分,负责在自己的调用中启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdout和stderr输出,以及生成和处理对应于子进程生命周期中的点的时间,配置文件路径/etc/supervisor/supervisord.confsupervisorctl:命令行客户端- 为supervisord提供的功能提供了一个shell样界面,从
supervisorctl用户可以连接到不同的supervisor进程,在由子进程控制的子进程上获取状态,停止和启动子进程,并获取supervisord的运行进程列表。 - 命令行客户端通过unix域套接字或TCP套接字与服务器通信
- 为supervisord提供的功能提供了一个shell样界面,从
- 网络服务器:访问服务器URL(例如 http://localhost:9001/),以在激活配置文件的 [inet_http_server] 部分后通过Web界面查看和控制进程状态。
- XML-RPC接口:用户询问和控制管理程序及其运行的程序
- 平台要求:支持linux(ubuntu),Mac OS X,Solaris 和FreeBSD,不支持任何版本的windows,可在python2.4或更高版本工作,不支持python3
安装
- ubuntu安装 :
sudo apt-get install supervisor - centos安装 :
sudo yum install supervisor - pip形式安装:
pip install supervisor - easy_install安装:
easy_install supervisor - 配置文件地址:
/etc/supervisor/supervisord.conf
运行
/usr/bin/python2 /usr/bin/supervisord -c /etc/supervisor/supervisord.conf# 第一次启动- 添加程序,最简单的添加程序可直接编辑supervisord.conf,新增如下配置
[program:foo] command=/bin/cat - supervisord命令选项说明:
superviord
-c FILE|--configuration=FILE配置文件-n|--前台运行-u USER|--user=USER执行命令的用户身份-e LEVEL|--loglevel=LEVEL日志记录级别-v|--version查看版本-h|--help查看帮助- …详见官方文档
- 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保持阅读历史
- 运行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
配置说明
文件格式
- windows-ini的风格,由部分(每个由[header]表示)和部分中的键值对组成
- 环境变量:存在于环境中的环境变量可以在配置文件中使用Python字符串表达式语法 %(ENV_X)s
- 示例
[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
错误集锦
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版权协议,转载请附上原文出处链接和本声明。