Supervisor 安装配置与使用详解

最近开发过程中,遇到个问题就是发送邮件队列的处理,原本需要在命令行手动处理,思考需要一个自动化管理的工具。于是就找到了这款工具。Supervisor 是一个 Linux 操作系统上的进程监控软件。

Supervisor

是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。(http://supervisord.org/

它存在的意思就是可以实现监控进程的状态、自动重启进程等操作,便于一些服务的维护与监控。 下面介绍一下安装和使用。

安装

由于搜索的各种教程在我的虚拟机测试有行不通,我们就直接简单的源码安装

首先确定你使用的root用户

源码安装

1.下载

supervisor依赖于meld3包所以将它一块下载

wget https://share.imwnk.cn/down/Other/meld3-1.0.2.tar.gz
wget https://share.imwnk.cn/down/Other/supervisor-3.3.4.tar.gz

可以去官网查找最新版本。

20180811204108.png

2.解压

tar -zxvf meld3-1.0.2.tar.gz 
tar -zxvf supervisor-3.3.4.tar.gz

20180811204229.png

3.安装

20180811204601.png

如果python setup.py install报错以下代码

Traceback (most recent call last):
  File "setup.py", line 1, in <module>
    from setuptools import setup
ImportError: No module named setuptools

请安装python-setuptools 执行sudo yum install python-setuptools -y安装

# 先安装依赖
cd meld3-1.0.2
python setup.py install

# 再安装 supervisor
cd supervisor-3.3.4
python setup.py install

easy_install 安装

安装相关依赖

sudo yum install python-pip python-devel  python-setuptools -y 
easy_install supervisor

检查安装是否成功

安装完成之后多了3个工具:echo_supervisord_confsupervisorctlsupervisord

echo_supervisord_conf检测安装是否成功

echo_supervisord_conf

20180811205021.png 安装成功。

配置

先通过 echo_supervisord_conf 命令生成配置文件,路径随你指定。

20180811205232.png

配置文件参数说明

supervisor的配置参数较多,下面介绍一下常用的参数配置,详细的配置及说明,请参考官方文档介绍。 注:分号(;)开头的配置表示注释

[unix_http_server]
file=/tmp/supervisor.sock   ; UNIX socket 文件,supervisorctl 会使用
;chmod=0700                 ; socket 文件的 mode,默认是 0700
;chown=nobody:nogroup       ; socket 文件的 owner,格式: uid:gid
;[inet_http_server]         ; HTTP 服务器,提供 web 管理界面
;port=127.0.0.1:9001        ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性
;username=user              ; 登录管理后台的用户名
;password=123               ; 登录管理后台的密码
[supervisord]
logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB        ; 日志文件大小,超出会 rotate,默认 50MB
logfile_backups=10           ; 日志文件保留备份数量默认 10
loglevel=info                ; 日志级别,默认 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 文件
nodaemon=false               ; 是否在前台启动,默认是 false,即以 daemon 的方式启动
minfds=1024                  ; 可以打开的文件描述符的最小值,默认 1024
minprocs=200                 ; 可以打开的进程数的最小值,默认 200
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord
; 包含其他的配置文件
[include]
files = relative/directory/*.ini    ; 可以是 *.conf 或 *.ini

测试

运行以下命令启动 supervisord 进程,可测试 supervisord 是否安装成功并执行。

supervisord -c /etc/supervisord.conf

使用 ps 命令查看是否运行

ps aux | grep supervisord

这里我们不着急。避免下面会出错,所以先配置文件。

配置文件

vim /etc/supervisord.conf

修改配置文件

;加载/etc/supervisor/目录下所有的配置文件
[include]
files = /etc/supervisor/*.conf

修改后保存

20180811210349.png

下面创建目录

20180811210119.png

# 创建目录用于保存 program 配置文件
mkdir -p /etc/supervisor

创建 program 配置文件

到目录下创建/etc/supervisor/lablog-sebd-mail.conf文件,先给出模板文件,可以根据需求更改

;program名称,随便写,但不要重复,是program的唯一标识
[program:lablog-send-mail]
;指定运行目录
directory=/data/www/lablog
;运行目录下执行命令
command=/usr/bin/php /data/www/lablog/artisan queue:work
;进程名称
process_name=%(program_name)s_%(process_num)02d
;启动设置
numprocs=1         ;进程数,注意:(celery进程数量,不是work数量,相当于执行了10个command命令,而不是在celery中指定-c 为10)
autostart=true      ;当supervisor启动时,程序将会自动启动
autorestart=true    ;自动重启(当work被kill了之后会重新启动)
;运行程序的用户
;user=root
;startsecs=1 ;程序重启时候停留在runing状态的秒数
;startretries=10 ;启动失败时的最多重试次数
;停止信号,默认TERM
;中断:INT (类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
;终止:TERM (kill -TERM pid)
;挂起:HUP (kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
;从容停止:QUIT (kill -QUIT pid)
stopsignal=INT

如果前面测试启动这里

重启supervisord进程:

supervisorctl -c supervisord.conf reload

注意:每次修改配置文件,都需要执行此命令。

supervisorctl的用法

supervisord : 启动supervisor
supervisorctl reload :修改完配置文件后重新启动supervisor
supervisorctl status :查看supervisor监管的进程状态
supervisorctl start 进程名 :启动XXX进程
supervisorctl stop 进程名 :停止XXX进程
supervisorctl stop all:停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl update:根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

开机启动Supervisor服务

配置systemctl服务

20180811211734.png

1.进入 /lib/systemd/system 目录,并创建supervisord.service文件写入以下代码

[Unit]
Description=supervisor
After=network.target

[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

2.设置开机启动

systemctl enable supervisord.service
systemctl daemon-reload

20180811211948.png

3.修改文件权限为766

chmod 766 supervisord.service

配置service类型服务

#!/bin/bash
#
# supervisord   This scripts turns supervisord on
#
# Author:       Mike McGrath <mmcgrath@redhat.com> (based off yumupdatesd)
#
# chkconfig:    - 95 04
#
# description:  supervisor is a process control utility.  It has a web based
#               xmlrpc interface as well as a few other nifty features.
# processname:  supervisord
# config: /etc/supervisor/supervisord.conf
# pidfile: /var/run/supervisord.pid
#

# source function library
. /etc/rc.d/init.d/functions

RETVAL=0

start() {
    echo -n $"Starting supervisord: "
    daemon "supervisord -c /etc/supervisord.conf "
    RETVAL=$?
    echo
    [ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
}

stop() {
    echo -n $"Stopping supervisord: "
    killproc supervisord
    echo
    [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/supervisord
}

restart() {
    stop
    start
}

case "$1" in
  start)
    start
    ;;
  stop) 
    stop
    ;;
  restart|force-reload|reload)
    restart
    ;;
  condrestart)
    [ -f /var/lock/subsys/supervisord ] && restart
    ;;
  status)
    status supervisord
    RETVAL=$?
    ;;
  *)
    echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
    exit 1
esac

exit $RETVAL

将上述脚本内容保存到/etc/rc.d/init.d/supervisord文件中,修改文件权限为755,并设置开机启动

chmod 755 /etc/rc.d/init.d/supervisord
chkconfig supervisord on

启动演示

20180811213150.png

其他

  • 默认配置文件:/etc/supervisord.conf

  • 进程管理配置文件放到:/etc/supervisor/目录下即可

  • Supervisor只能管理非daemon的进程,也就是说Supervisor不能管理守护进程。否则提示Exited too quickly (process log may have details)异常。

  • Supervisord主要用来管理进程,而不是调度任务,因此如果有定时任务的需求,跟结合crontab一起使用。

program配置模板

  • 完整
[program:cat]
command=/bin/cat
process_name=%(program_name)s
numprocs=1
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=true
startsecs=10
startretries=3
exitcodes=0,2
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
  • 简化
[program:test]
command=python test.py
directory=/home/supervisor_test/
autorestart=true
stopsignal=INT
user=root
stdout_logfile=test_out.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=test_err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
  • 说明 为必须填写项; [program:应用名称][program:cat]
;*命令路径,如果使用python启动的程序应该为 python /home/test.py, 
;不建议放入/home/user/, 对于非user用户一般情况下是不能访问
command=/bin/cat

;当numprocs为1时,process_name=%(program_name)s
;当numprocs>=2时,%(program_name)s_%(process_num)02d
process_name=%(program_name)s

;进程数量
numprocs=1

;执行目录,若有/home/supervisor_test/test1.py
;将directory设置成/home/supervisor_test
;则command只需设置成python test1.py
;否则command必须设置成绝对执行目录
directory=/tmp

;掩码:--- -w- -w-, 转换后rwx r-x w-x
umask=022

;优先级,值越高,最后启动,最先被关闭,默认值999
priority=999

;如果是true,当supervisor启动时,程序将会自动启动
autostart=true

;*自动重启
autorestart=true

;启动延时执行,默认1秒
startsecs=10

;启动尝试次数,默认3次
startretries=3

;当退出码是0,2时,执行重启,默认值0,2
exitcodes=0,2

;停止信号,默认TERM
;中断:INT(类似于Ctrl+C)(kill -INT pid),退出后会将写文件或日志(推荐)
;终止:TERM(kill -TERM pid) //信号量参考文章(http://c.biancheng.net/cpp/html/2784.html)
;挂起:HUP(kill -HUP pid),注意与Ctrl+Z/kill -stop pid不同
;从容停止:QUIT(kill -QUIT pid)
;KILL, USR1, USR2其他见命令(kill -l),说明1
stopsignal=TERM

stopwaitsecs=10

;*以root用户执行
user=root

;重定向
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

参考文档: https://blog.csdn.net/python36/article/details/80571888 https://blog.csdn.net/xyang81/article/details/51555473 https://thief.one/2018/06/01/1/ https://www.cnblogs.com/sfnz/p/5578417.html https://blog.csdn.net/xyang81/article/details/51555473

微信打赏微信打赏
支付宝打赏支付宝打赏

评论: