作者归档:eValor

SuperVisor 优秀的进程管理工具

Supervisor 是一个用 Python 编写的进程管理工具,可以在大多数的 UNIX 系统中高效的管理进程,对一些需要保持常驻运行,又不方便注册成系统服务的程序提供守护进程,在应用意外崩溃时还可以自动重启应用

安装

安装非常简单,有多种安装方式,在 CentOS 下可以使用 PIP 或者 YUM 安装,这里介绍使用 PIP 进行安装,更多的安装方法可以查看官网的例子 点我直达,执行下面命令进行安装,如果没有报错的话,就可以进行下一步的配置了

yum install python-setuptools
easy_install pip
pip install supervisor

配置

生成配置也非常简单,SuperVisor 提供了一个生成配置文件的命令 echo_supervisord_conf ,请确保有 ROOT 权限,或者 SUDO 执行,配置文件统一放在 /etc 路径下方便管理

# 写出配置文件
echo_supervisord_conf > /etc/supervisord.conf
# 新建一个文件夹统一存放需要管理的进程配置
mkdir /etc/supervisord.d/

为了方便管理,这里把需要管理的进程配置单独存放在一个文件夹,修改一下配置文件,在最后加入以下代码,以引入这个文件夹里的配置,更多的配置项可以参考本文最后的配置文件参考

[include]
files = /etc/supervisord.d/*.conf

自启动

在 CentOS7 下新建一个服务单元文件 /usr/lib/systemd/system/supervisord.service 并粘贴下面的代码

# supervisord service for systemd (CentOS 7.0+)
# by ET-CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target

其他系统的启动脚本可以参考官方给出的 GitHub ,然后执行命令 systemctl enable supervisord 设置为自启动

配置文件参考

; 样板配置文件
;
; 更多关于配置文件的信息和选项,请参考下面的链接:
; http://supervisord.org/configuration.html
;
; 注意:
;  - Shell 扩展 ("~" 或者 "$HOME") 是不被支持的.  环境变量可以使用
;    这样的语法: "%(ENV_HOME)s".

;  - 值周围的引号也是不被支持的, 除非像下面的 environment= 选项这样使用

;  - 注释前面至少要有一个前导空格: 用 "a=b ;comment" 而不是 "a=b;comment".

;  - 如果命令看起来像是一个配置文件的注释,那么他将被截断, 像下面的例子这样.
;    "command=bash -c 'foo ; bar'" 将被理解成 "command=bash -c 'foo ".

[unix_http_server]
file=/tmp/supervisor.sock   ; socket文件的路径 (XML-RPC)
;chmod=0700                 ; socket文件的权限 (默认是 0700)
;chown=nobody:nogroup       ; socket文件 uid:gid 所有者
;username=user              ; 默认是没有账号的 (开放服务)
;password=123               ; 默认是没有密码的 (开放服务)

;[inet_http_server]         ; 网络 (TCP) 服务默认是关闭的
;port=127.0.0.1:9001        ; 地址和端口定义, *:port 监听所有地址
;username=user              ; 默认是没有账号的 (开放服务)
;password=123               ; 默认是没有密码的 (开放服务)

[supervisord]
logfile=/tmp/supervisord.log ; 主日志, 默认 $CWD/supervisord.log
logfile_maxbytes=50MB        ; 单个日志文件的大小上限, 默认 50MB
logfile_backups=10           ; 保留日志备份文件的数量, 0 表示不启用 默认 10
loglevel=info                ; 日志级别, 默认 info; 可选: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord 进程标识符文件, 默认 supervisord.pid
nodaemon=false               ; 设置为 true 将以非守护(前台)模式启动, 默认 false
minfds=1024                  ; 申请的文件描述符数量 少于这个数量将无法启动, 默认 1024
minprocs=200                 ; 申请的进程描述符数量 少于这个数量将无法启动, 默认 200
;umask=022                   ; supervisord 进程的 umask; 默认 022
;user=chrism                 ; 默认是当前用户, root用户必须
;identifier=supervisor       ; supervisord 的进程标识, 默认 'supervisor'
;directory=/tmp              ; 启动时要切换到的目录 默认不切换
;nocleanup=true              ; 启动时不要清理临时文件 默认 false
;childlogdir=/tmp            ; 'AUTO' 子日志目录, 默认是 $TEMP
;environment=KEY="value"     ; 需要添加到环境变量的键值对
;strip_ansi=false            ; 在日志文件中不使用ansi格式 默认 false

; rpcinterface:supervisor 区块必须保留在配置文件中供 RPC (supervisorctl 或者
; web interface)使用. 需要扩展RPC接口可以增加像 [rpcinterface:x] 这样定义的区块

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

; supervisorctl 区块可以配置 supervisorctl 如何连接到 supervisord
; 在 unix_http_server 或者inet_http_server section 区块使用相匹配的设置

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// unix socket 的 URL 地址 
;serverurl=http://127.0.0.1:9001 ; 使用 http:// url 来指定一个网络链接
;username=chris              ; 使用和服务器配置相同的账号(如果有账号)
;password=123                ; 使用和服务器配置相同的密码(如果有密码)
;prompt=mysupervisor         ; 命令行提示符 (默认 "supervisor")
;history_file=~/.sc_history  ; 使用 readline 历史记录 如果可用

; 下面的程序定义部分 列出了所有可能用到的配置选项 下面只是一个例子
; 请自己编辑这部分来创建一个或多个 "真实" 的应用程序来监控它的运行

;[program:theprogramname]
;command=/bin/cat              ; 需要运行的程序 (绝对路径, 可以带参数)
;process_name=%(program_name)s ; 进程名称 (默认 %(program_name)s)
;numprocs=1                    ; 需要启动的进程数量 (默认启动1个)
;directory=/tmp                ; 在启动之前需要改变到的目录 (默认不改变)
;umask=022                     ; 进程的 umask (默认没有设置)
;priority=999                  ; 相对的启动优先级 (默认为 999)
;autostart=true                ; 在supervisord启动时一起启动 (默认: true)
;startsecs=1                   ; 程序从启动状态变为运行状态等待的时间 (默认1秒 详见手册)
;startretries=3                ; 启动失败的最大重试次数 (默认3次)
;autorestart=unexpected        ; 是否自动重启 默认意外退出时重启
;exitcodes=0,2                 ; 期望自动重启的状态码 默认0和2
;stopsignal=QUIT               ; 用于杀死进程的信号 (默认 TERM)
;stopwaitsecs=10               ; 杀死进程的最大等待时间 发送 SIGKILL (默认 10 秒)
;stopasgroup=false             ; 将停止信号发送到UNIX进程组 (默认 false)
;killasgroup=false             ; 将 SIGKILL 信号发送到UNIX进程组 (默认 false)
;user=chrism                   ; 调用 setuid 以特定的UNIX用户运行该程序
;redirect_stderr=true          ; 转发程序的 stderr 到 stdout (默认 false)
;stdout_logfile=/a/path        ; stdout 日志路径, NONE 则不记录日志; 默认 AUTO
;stdout_logfile_maxbytes=1MB   ; stdout 日志文件的分割大小 (默认 50MB)
;stdout_logfile_backups=10     ; stdout 日志备份数量 0 表示不启用 默认 10
;stdout_capture_maxbytes=1MB   ; 当进程处于标准输出捕捉模式时写入FIFO的最大字节数 默认0
;stdout_events_enabled=false   ; 进程写入 stdout 时触发事件 (默认 false)
;stderr_logfile=/a/path        ; stderr 日志路径, NONE 则不记录日志; 默认 AUTO
;stderr_logfile_maxbytes=1MB   ; stderr 日志文件的分割大小 (默认 50MB)
;stderr_logfile_backups=10     ; stderr 日志备份数量 0 表示不启用 默认 10
;stderr_capture_maxbytes=1MB   ; 当进程处于标准输出捕捉模式时写入FIFO的最大字节数 默认0
;stderr_events_enabled=false   ; 进程写入 stderr 时触发事件 (默认 false)
;environment=A="1",B="2"       ; 额外的环境变量 (默认没有额外的环境变量)
;serverurl=AUTO                ; 重写 serverurl (childutils)

; 下面是程序的监听器部分 列出了所有可能用到的配置选项 下面只是一个例子
; 请自己编辑这部分来创建一个或多个 "真实" 的监听器来捕捉并处理事件

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; 需要运行的程序 (绝对路径, 可以带参数)
;process_name=%(program_name)s ; 进程名称 (默认 %(program_name)s)
;numprocs=1                    ; 需要启动的进程数量 (默认启动1个)
;events=EVENT                  ; 感兴趣的事件列表
;buffer_size=10                ; 事件缓冲队列的尺寸 (默认 10)
;directory=/tmp                ; 在启动之前需要改变到的目录 (默认不改变)
;umask=022                     ; 进程的 umask (默认没有设置)
;priority=-1                   ; 相对的启动优先级 (默认为 999)
;autostart=true                ; 在supervisord启动时一起启动 (默认: true)
;startsecs=1                   ; 程序从启动状态变为运行状态等待的时间 (默认1秒 详见手册)
;startretries=3                ; 启动失败的最大重试次数 (默认3次)
;autorestart=unexpected        ; 是否自动重启 默认意外退出时重启
;exitcodes=0,2                 ; 期望自动重启的状态码 默认0和2
;stopsignal=QUIT               ; 用于杀死进程的信号 (默认 TERM)
;stopwaitsecs=10               ; 杀死进程的最大等待时间 发送 SIGKILL (默认 10 秒)
;stopasgroup=false             ; 将停止信号发送到UNIX进程组 (默认 false)
;killasgroup=false             ; 将 SIGKILL 信号发送到UNIX进程组 (默认 false)
;user=chrism                   ; 调用 setuid 以特定的UNIX用户运行该程序
;redirect_stderr=false         ; 转发程序的 stderr 到 stdout (默认 false)
;stdout_logfile=/a/path        ; stdout 日志路径, NONE 则不记录日志; 默认 AUTO
;stdout_logfile_maxbytes=1MB   ; stdout 日志文件的分割大小 (默认 50MB)
;stdout_logfile_backups=10     ; stdout 日志备份数量 0 表示不启用 默认 10
;stdout_events_enabled=false   ; 进程写入 stdout 时触发事件 (默认 false)
;stderr_logfile=/a/path        ; stderr 日志路径, NONE 则不记录日志; 默认 AUTO
;stderr_logfile_maxbytes=1MB   ; stderr 日志文件的分割大小 (默认 50MB)
;stderr_logfile_backups=10     ; stderr 日志备份数量 0 表示不启用 默认 10
;stderr_events_enabled=false   ; 进程写入 stderr 时触发事件 (默认 false)
;environment=A="1",B="2"       ; 额外的环境变量 (默认没有额外的环境变量)
;serverurl=AUTO                ; 重写 serverurl (childutils)

; 可以将几个程序构成一组 统一控制 列出了所有可能用到的配置选项 下面只是一个例子
; 请自己编辑这部分来创建一个或多个 "真实" 的程序组

;[group:thegroupname]
;programs=progname1,progname2  ; 填入 [program:x] 中的 'x'
;priority=999                  ; 相对的启动优先级 (默认为 999)

; 可以包含其他文件的设置, 这里可以列出多个文件(由空格或者换行符分隔)并且可以
; 包含通配符, 文件路径的定义是相对于当前的配置文件, 引入的文件**不能**含有
; 这个(即现在正在编辑的这个)配置文件本身

;[include]
;files = relative/directory/*.ini