官网 http://supervisord.org/
supervisor是一个容许用户监视和控制在linux操做系统的进程数量的客户端/服务器系统。由python语言编写,用以监控服务器的运行,发现问题能当即自动预警及自动重启等功能。supervisor还要求管理的程序是非daemon程序,supervisord会帮你把它转成daemon程序。前端
服务端,他负责在他本身的进程下起一个子进程,相应来自客户端的命令,重启崩溃或异常退出的子进程,输出相关日志,针对于子进程活跃期间的时间进行生成和管理
配置文件位置: /etc/supervisord.conf 注意配置合理权限python
命令行客户端,有supervisord提供的一个shell-like接口,经过它,用户能够链接到不一样的supervisorctl进程,查看,起停子进程,列出正在运行的子进程。经过TCP进行交互,提供认证,在[supervisorctl]段进行统一的配置linux
supervisorctl的web管理界面,经过访问http://localhost:9001/来管理子进程状态,[inet_http_server]这段进行配置nginx
前提条件是要有python环境,linux通常自带python环境,这里以centOS为例。web
yum install -y supervisor
systemctl start supervisor
生成配置文件:
echo_supervisord_conf > /tmp/supervisord.conf
通常yum安装后配置文件默认位置是/etc/supervisor/supervisord.conf。其中注释是以分号开头shell
[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
查看状态socket
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界面。浏览器输入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。主要仍是看日志信息,和程序自己的日志。