进程挂了怎么办?用用它就知道啦
一、前言
Supervisor是一款基于python的进程管理工具,可供用户自由管理类unix操作系统上的进程。它提供了许多简单可用的配置项,比如:自动重启挂掉的进程、自动log rotation等。它包含supervisord、supervisorctl和web server等组件,这就让我们能轻松管理、监控自己的服务。
二、安装
一切工具的引入的都免不了需要介绍它的安装步骤,supervisor自然也是这样。由于我们服务器不能连接外网,这里推荐使用下载tar包安装。
-
下载supervisor以及依赖的组件(安装包见附件)
-
安装、创建配置文件(脚本详见附件)
shell## 安装 cd supervisor-{version} sudo python setup.py install ## 创建配置文件 echo_supervisord_conf > /etc/supervisord.conf
-
启动试运行
shell## 启动 supervisord -c /etc/supervisord.conf
三、使用
在正式运用Supervisor管理我们的业务进程之前,先了解一下它的后台守护进程(supervisord)的基础配置项、终端(supervisorctl)的使用命令。
- supervisord配置文件
shell
;Server配置区
[unix_http_server] ; 采用unix socket的server配置
file=/tmp/supervisor.sock ; socket文件路径
;username=user ; 用户名(默认不设置)
;password=123 ; 密码(默认不设置)
;[inet_http_server] ; 采用inet socket的server配置
;port=127.0.0.1:9001 ; 监听网卡及端口(*:port 所有网卡)
;username=user ; 用户名(默认不设置)
;password=123 ; 密码(默认不设置)
;守护进程配置项区
[supervisord]
logfile=/tmp/supervisord.log ; supervisord日志文件
logfile_maxbytes=50MB ; supervisord日志文件大小
logfile_backups=10 ; supervisord日志文件rotation个数
loglevel=info ; supervisord日志层级(默认: info; 其他: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; supervisord的pid文件
;客户端配置项区
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;unix socket地址
;serverurl=http://127.0.0.1:9001 ;inet socket地址
;username=chris ; 用户名
;password=123 ; 密码
;业务进程配置区
;[program:theprogramname] ; 进程标志
;command=/bin/cat ; 进程执行命令
;process_name=%(program_name)s ; 进程名称表达式 (默认 %(program_name)s)
;numprocs=1 ; 启动的进程数量 (默认 1)
;directory=/tmp ; 进程执行命令所在目录
;umask=022 ; 进程执行权限
;priority=999 ; 进程执行优先级 (默认 999)
;autostart=true ; 是否在supervisord启动时自启 (默认: true)
;startsecs=1 ; 进程启动后监控的秒数 (默认: 1s)
;startretries=3 ; 进程启动失败后的重启次数
;autorestart=true ; 进程挂掉后是否重启
;user=chrism ; 进程执行用户
;redirect_stderr=true ; 是否将标准错误重定向至标准输出
;stdout_logfile=/a/path ; 标准输出日志文件路径
;stdout_logfile_maxbytes=1MB ; 标准输出日志文件大小 (默认 50MB)
;stdout_logfile_backups=10 ; 标准输出日志文件保存数量 (默认 10)
;stderr_logfile=/a/path ; 标准错误日志文件路径
;stderr_logfile_maxbytes=1MB ; 标准错误日志文件大小 (默认 50MB)
;stderr_logfile_backups=10 ; 标准错误日志文件保存数量 (默认 10)
;业务进程组配置区
;[group:thegroupname]
;programs=progname1,progname2 ; 进程组包含的进程
;priority=999 ; 进程组启动的优先级 (默认 999)
;外部包含配置区
[include] ; 业务进程或进程组单独配置时,可应用
files = /data/webdocs/script/supervisor/*.conf
进程管理配置参数,不建议全都写在supervisord.conf文件中,应该每个进程写一个配置文件放在include指定的目录下包含进supervisord.conf文件中。
- supervisord执行命令
shell
supervisord -c supervisord.conf # 根据配置文件supervisord.conf启动supervisor服务
- supervisorctl使用命令
shell
supervisorctl status # 进程运行状态
supervisorctl start <name> # 启动某进程
supervisorctl start <gname>:* # 启动某进程组
supervisorctl start all # 启动所有进程
supervisorctl stop <name> # 停止某进程
supervisorctl stop <gname>:* # 停止某进程组
supervisorctl stop all # 停止所有进程
supervisorctl restart <name> # 重启某进程
supervisorctl restart <gname>:* # 重启某进程组
supervisorctl restart all # 重启所有进程
supervisorctl reload # 重启supervisord,会重启所有进程
supervisorctl reread # 显示配置文件发生更改的进程,但是不重启进程
supervisorctl update # 重启配置文件发生更改的进程,会添加或移除进程
supervisorctl clear all # 清空所有进程的日志文件
supervisorctl是supervisord的一个命令行客户端工具,启动时需要指定与 supervisord使用同一份配置文件,否则与supervisord一样按照顺序查找配置文件,或者可以在启动supervisord时使用inet socket启动server,这样supervisorctl可以通过socket进行访问。
- web server
除了使用supervisorctl之外,还可以配置supervisrod启动web管理界面,这个web后台使用 Basic Auth的方式进行身份认证。
四、原理
Supervisord生成主进程并将主进程变成守护进程,supervisord依次生成配置文件中的工作进程,然后依次监控工作进程的工作状态,这些工作进程托管于supervisord主进程,因为它们的父进程便是supervisord主进程。并且主进程负责与supervisorctl客户端通信,负责子进程的信号监听,实现主进程对子进程的控制。
如图所示,supervisord的父进程pid为1(系统内核进程),而业务进程的父进程pid是13108,即supervisord进程,说明业务进程被supervisord托管。
五、结语
Supervisor是一款简单方便配置的进程管理工具,它提供了可视化界面和终端来呈现与管理用户进程。本文简单介绍Supervisor的使用方法,它有很丰富的功能,还有其他很多项配置,可以在官方文档获取更多信息:supervisord.org/index.html