共计 4594 个字符,预计需要花费 12 分钟才能阅读完成。
简介
官网 http://supervisord.org/
supervisor 是一个允许用户监视和控制在 linux 操作系统的进程数量的客户端 / 服务器系统。由 python 语言编写,用以监控服务器的运行,发现问题能立即自动预警及自动重启等功能。supervisor 还要求管理的程序是非 daemon 程序,supervisord 会帮你把它转成 daemon 程序。
组件
- supervisord
服务端,他负责在他自己的进程下起一个子进程,相应来自客户端的命令,重启崩溃或异常退出的子进程,输出相关日志,针对于子进程活跃期间的时间进行生成和管理
配置文件位置:/etc/supervisord.conf 注意配置合理权限
- supervisorctl
命令行客户端,有 supervisord 提供的一个 shell-like 接口,通过它,用户可以连接到不同的 supervisorctl 进程,查看,起停子进程,列出正在运行的子进程。通过 TCP 进行交互,提供认证,在 [supervisorctl] 段进行统一的配置
- web server
supervisorctl 的 web 管理界面,通过访问 http://localhost:9001/ 来管理子进程状态,[inet_http_server]这段进行配置
安装
前提条件是要有 python 环境,linux 一般自带 python 环境,这里以 centOS 为例。
- yum 安装
yum install -y supervisor
启动
systemctl start supervisor
配置文件解析
生成配置文件:
echo_supervisord_conf > /tmp/supervisord.conf
一般 yum 安装后配置文件默认位置是 /etc/supervisor/supervisord.conf。其中注释是以分号开头
[unix_http_server] #这段是通过 socket 文件启动的 web server,这个要有,因为命令行 supervisorctl 是通过这个实现的。file = /tmp/supervisor.sock | |
chmod = 0777 | |
chown= nobody:nogroup | |
username = user | |
password = 123 | |
[inet_http_server] #通过网络端口启动的 web server | |
port = 127.0.0.1:9001 | |
username = user | |
password = 123 | |
[supervisord] #这块是服务配置 | |
logfile = /tmp/supervisord.log 日志文件 | |
logfile_maxbytes = 50MB 日志文件最大 size | |
logfile_backups=10 日志轮询下备份数 | |
loglevel = info 日志级别 | |
pidfile = /tmp/supervisord.pid pid 文件位置 | |
nodaemon = false 如果是 true,supervisor 将在前端启动 | |
minfds = 1024 supervisord 启动成功的最小文件描述符数 | |
minprocs = 200 supervisord 启动成功的最小进程描述符数 | |
umask = 022 | |
user = chrism 启动用户,这块要注意,这个用户要有相应的目录权限 | |
identifier = supervisor supervisor 进程的 identifier 字符串,用户 RPC 协议接口 | |
directory = /tmp 当 supervisord 服务 daemonizes 时,切换到这个目录,可用这个 %(here)s 变量来扩展到整个配置文件 | |
nocleanup = true 禁止 supervisord 在启动时间清空任何存在的 AUTO 子日志文件 | |
childlogdir = /tmp AUTO 自日志文件目录 | |
strip_ansi = false 除去在子日志文件中所有的 ANSI 转义序列 | |
environment = KEY1="value1",KEY2="value2" 一个键 / 值的列表,一个环境变量吧?[supervisorctl] | |
serverurl = unix:///tmp/supervisor.sock | |
username = chris | |
password = 123 | |
prompt = mysupervisor String used as supervisorctl prompt. 作为 supervisorctl 提示字符串。 |
管理进程配置
配置文件位置:/etc/supervisor/conf.d/
一般有如下配置项:
process_name=%(program_name)s #进程名称,默认是程序名称 | |
command 启动程序命令 | |
numprocs=1 #进程数量 | |
directory=/tmp #路径 | |
umask=022 #掩码 | |
priority=999 #优先级,越大被开起的越早 | |
autorestart=true #自动重启 | |
startsecs=10 #启动等待时间(秒)startretries=3 #启动重试次数 | |
stopsignal=TERM #关闭信号 | |
stopwaitsecs=10 #关闭前等待时间 | |
user=chrism #监控用户权限 | |
redirect_stderr=false #重定向报错输出 | |
stdout_logfile=/a/path #输入重定向为日志 | |
stdout_logfile_maxbytes=1MB #日志大小 | |
stdout_logfile_backups=10 #日志备份 | |
stdout_capture_maxbytes=1MB | |
stderr_logfile=/a/path | |
stderr_logfile_maxbytes=1MB | |
stderr_logfile_backups=10 | |
stderr_capture_maxbytes=1MB | |
environment=A=1,B=2 #预定义环境变量 | |
serverurl=AUTO #系统 URL |
示例
为了更好的展示,我这边写了一个简单的服务。下面的具体的代码:
#!/usr/bin/env python | |
import socket | |
HOST, PORT = '', 8080 | |
listen_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) | |
listen_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) | |
listen_socket.bind((HOST, PORT)) | |
listen_socket.listen(1) | |
while True: | |
client_connection, client_address = listen_socket.accept() | |
request = client_connection.recv(1024) | |
http_response = """\ | |
HTTP/1.1 200 OK | |
Hello World! | |
""" | |
client_connection.sendall(http_response) | |
client_connection.close() |
这个脚本是一个简单的 web 服务器,8080 端口,所有访问都会返回 Hello World!
下面我们看下配置文件 /etc/supervisor/conf.d/webserver.conf
[program:webserver] | |
autostart=true | |
startretries=3 | |
command=/opt/webserver.py |
查看状态
root@0c1fc23d1398:~# supervisorctl status | |
webserver RUNNING pid 1120, uptime 0:08:07 |
supervisorctl 命令
1. 交互模式
直接输入 supervisorctl 就进入交互模式。
root@0c1fc23d1398:~# supervisorctl | |
webserver RUNNING pid 1120, uptime 0:09:40 | |
supervisor> |
2. 命令行模式
如上节所说的supervisorctl status
3. 具体命令项
交互和命令行模式有一样。
reread 重新加载配置文件 | |
update 将配置文件里新增的子进程加入进程组,如果设置了 autostart=true 则会启动新新增的子进程 | |
status 查看所有进程状态 | |
status 查看指定进程状态 | |
start all 启动所有子进程 | |
start 启动指定子进程 | |
restart all 重启所有子进程 | |
restart 重启指定子进程 | |
stop all 停止所有子进程 | |
stop 停止指定子进程 | |
reload 重启 supervisord | |
add 添加子进程到进程组 | |
reomve 从进程组移除子进程,需要先 stop。注意:移除后,需要使用 reread 和 update 才能重新运行该进程 |
web server 界面
还记得“配置文件解析”一节关于 web server 段的配置吗?不记得可以回去看一眼。我们稍微展示下 web 界面。浏览器输入 http://<ip>:<port>,会弹出输入用户名和密码的弹窗,输入信息后可以看到界面了。
web 界面
从界面中可以看到,服务的状态,进程 id 和运行的时间。还有一些简单的操作,例如重启,停止,清除日志,监控日志等。
常见的错误
1. 多进程启动
报错信息如下:
Starting supervisor: Error: %(process_num) must be present within process_name when numprocs > 1 in section 'program:nginx' (file: '/etc/supervisor/conf.d/nginx.conf') | |
For help, use /usr/bin/supervisord -h |
这是配置文件格式不对,下面是格式简介
当 numprocs= 1 时,process_name=%(program_name)s
当 numprocs>= 2 时,%(program_name)s_%(process_num)
类似下面的配置
[program:sleeptime] | |
autostart=true | |
startretries=3 | |
command=/opt/sleeptime.py | |
#主要是下面的 2 行 | |
process_name=%(program_name)s%(process_num)s | |
numprocs=4 |
这个时候查看进程状态,会发现有 4 个进程出现
root@0c1fc23d1398:/etc/supervisor/conf.d# supervisorctl status | |
sleeptime:sleeptime0 RUNNING pid 1139, uptime 0:00:04 | |
sleeptime:sleeptime1 RUNNING pid 1140, uptime 0:00:04 | |
sleeptime:sleeptime2 RUNNING pid 1141, uptime 0:00:04 | |
sleeptime:sleeptime3 RUNNING pid 1142, uptime 0:00:03 | |
webserver RUNNING pid 1120, uptime 0:30:00 |
2. 直接运行 supervisorctl status 报:
Error: Server requires authentication | |
For help, use /usr/local/bin/supervisorctl -h |
因为你设置访问账号密码,所以只能先 supervisorctl 进去,在 status。
主要还是看日志信息,和程序本身的日志。