十分钟玩转Supervisor

进程挂了怎么办?用用它就知道啦

一、前言

Supervisor是一款基于python的进程管理工具,可供用户自由管理类unix操作系统上的进程。它提供了许多简单可用的配置项,比如:自动重启挂掉的进程、自动log rotation等。它包含supervisord、supervisorctl和web server等组件,这就让我们能轻松管理、监控自己的服务。

二、安装

一切工具的引入的都免不了需要介绍它的安装步骤,supervisor自然也是这样。由于我们服务器不能连接外网,这里推荐使用下载tar包安装。

  1. 下载supervisor以及依赖的组件(安装包见附件)

  2. 安装、创建配置文件(脚本详见附件)

    shell 复制代码
    ## 安装
    cd supervisor-{version}
    sudo python setup.py install
    
    ## 创建配置文件
    echo_supervisord_conf > /etc/supervisord.conf
  3. 启动试运行

    shell 复制代码
    ## 启动
    supervisord -c /etc/supervisord.conf

三、使用

在正式运用Supervisor管理我们的业务进程之前,先了解一下它的后台守护进程(supervisord)的基础配置项、终端(supervisorctl)的使用命令。

  1. 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文件中。

  1. supervisord执行命令
shell 复制代码
supervisord -c supervisord.conf  # 根据配置文件supervisord.conf启动supervisor服务
  1. 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进行访问。

  1. web server

除了使用supervisorctl之外,还可以配置supervisrod启动web管理界面,这个web后台使用 Basic Auth的方式进行身份认证。

四、原理

Supervisord生成主进程并将主进程变成守护进程,supervisord依次生成配置文件中的工作进程,然后依次监控工作进程的工作状态,这些工作进程托管于supervisord主进程,因为它们的父进程便是supervisord主进程。并且主进程负责与supervisorctl客户端通信,负责子进程的信号监听,实现主进程对子进程的控制。

graph TD Supervisord主进程-->管道 Supervisord主进程-->Supervisorctl进程 管道-->业务进程work1 管道-->业务进程work2

如图所示,supervisord的父进程pid为1(系统内核进程),而业务进程的父进程pid是13108,即supervisord进程,说明业务进程被supervisord托管。

五、结语

Supervisor是一款简单方便配置的进程管理工具,它提供了可视化界面和终端来呈现与管理用户进程。本文简单介绍Supervisor的使用方法,它有很丰富的功能,还有其他很多项配置,可以在官方文档获取更多信息:supervisord.org/index.html

相关推荐
许野平1 小时前
Rust: 利用 chrono 库实现日期和字符串互相转换
开发语言·后端·rust·字符串·转换·日期·chrono
齐 飞3 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
LunarCod3 小时前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
码农派大星。4 小时前
Spring Boot 配置文件
java·spring boot·后端
杜杜的man4 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*4 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go
llllinuuu4 小时前
Go语言结构体、方法与接口
开发语言·后端·golang
cookies_s_s4 小时前
Golang--协程和管道
开发语言·后端·golang
为什么这亚子5 小时前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
想进大厂的小王5 小时前
项目架构介绍以及Spring cloud、redis、mq 等组件的基本认识
redis·分布式·后端·spring cloud·微服务·架构