supervisor

supervisor


1. 简介

Supervisor是一个进程管理程序,python实现。

它的作用是监控进程状态,异常退出时会重启进程。它通过fork/exec的方式把被管理进程当作supervisor的子进程来启动。
supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

1.1. 安装

安装
pip install supervisor

pip show supervisor # 4.2.1

2. 使用

supervisor是一个C/S模型的程序,分为两部分:server端supervisord,和client端:supervisorctl。

  • supervisord
    运行Supervisor会启动一个进程 supervisord,它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。
  • supervisorctl
    命令行管理工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。

supervisor是所有进程的父进程,管理着启动的子进展,supervisor以子进程的PID来管理子进程,当子进程异常退出时supervisor可以收到相应的信号量。

配置分为两部分,第一步是supervisord配置并启动,第二步是声明program,第三步是使用supervisorctr启动子进程。

2.1. supervisord配置

安装完supervisor后,运行echo_supervisord_conf命令输出默认的配置项,重定向到配置文件:
echo_supervisord_conf > /etc/supervisord.conf

去除里面大部分注释和“不相关”的部分,先看这些配置:

  
[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 = /etc/supervisor/*.conf    ; 可以是 *.conf 或 *.ini  

配置文件保存为 /etc/supervisord.conf,然后启动supervisord
supervisord -c /etc/supervisord.conf
查看 supervisord 是否在运行:
ps aux | grep supervisord

2.2. program配置

子进程配置文件路径:/etc/supervisor/
具体路径可查看supervisord.conf的include选项。

注意事项:

  • 后台进程:Supervisor 只能管理在前台运行的程序,所以如果应用程序有后台运行的选项,需要关闭。
  • 子进程:有时候用 Supervisor 托管的程序还会有子进程(如 Tornado),如果只杀死主进程,子进程就可能变成孤儿进程。通过这两项配置来确保所有子进程都能正确停止:
    stopasgroup=true
    killasgroup=true
  • 全路径:配置项中的路径最好是全路径

配置案例:

  
[program:ce]  
directory = /home/code_1  
command = /usr/local/bin/celery beat -A celery_worker -l info --logfile=bbbb.log  
startsecs = 5  
autorestart = true  
startretries = 3  
user = root  
redirect_stderr = true  
stdout_logfile_maxbytes = 20MB  
stdout_logfile_backups = 20  
stdout_logfile = /var/log/supervisor_log/usercenter_stdout.log  

保存为/etc/supervisor/ce.conf

另一个配置案例

  
[program:test_one]  
command=java -jar /data/smallvideo/supervisor/taskApp-exec.jar TaskTestOne  ; 被监控的进程路径  
priority=1                    ; 数字越高,优先级越高  
numprocs=1                    ; 启动几个进程  
autostart=true                ; 随着supervisord的启动而启动  
autorestart=true              ; 自动重启  
startretries=10               ; 启动失败时的最多重试次数  
exitcodes=0                   ; 正常退出代码  
stopsignal=KILL               ; 用来杀死进程的信号  
stopwaitsecs=10               ; 发送SIGKILL前的等待时间  
redirect_stderr=true          ; 重定向stderr到stdout  

[program:test_two]  
command=java -jar /data/smallvideo/supervisor/taskApp-exec.jar TaskTestTwo   ; 被监控的进程路径  
priority=1                    ; 数字越高,优先级越高  
numprocs=1                    ; 启动几个进程  
autostart=true                ; 随着supervisord的启动而启动  
autorestart=true              ; 自动重启  
startretries=10               ; 启动失败时的最多重试次数  
exitcodes=0                   ; 正常退出代码  
stopsignal=KILL               ; 用来杀死进程的信号  
stopwaitsecs=10               ; 发送SIGKILL前的等待时间  
redirect_stderr=true          ; 重定向stderr到stdout  

2.3. 启动子程序

更新主程序配置,一定要执行,否则主程序配置未更新,找不到progarm
supervisorctl update
查看子程序列表
supervisorctl status

进入命令界面
supervisorctl
启动ce
start program
status

功能测试
手动终止celery进程
kill -9 169
status
可以看到ce重启的过程

3. 其它

3.1. supervisord操作

启动supervisord
supervisord -c /etc/supervisord.conf

通过 -c 选项指定配置文件路径,如果不指定会按照这个顺序查找配置文件:$CWD/supervisord.conf, $CWD/etc/supervisord.conf, /etc/supervisord.conf  

关闭supervisord
supervisorctl shutdown

查看是否正常运行
supervisorctl status

3.2. supervisorctl

supervisorctl 是 supervisord的命令行客户端工具

Supervisorctl 是 supervisord 的一个命令行客户端工具,启动时需要指定与 supervisord 使用同一份配置文件,否则与 supervisord 一样按照顺序查找配置文件。
supervisorctl -c /etc/supervisord.conf

update 更新新的配置到supervisord(不会重启原来已运行的程序)
reload,载入所有配置文件,并按新的配置启动、管理所有进程(会重启原来已运行的程序)
start xxx: 启动某个进程
restart xxx: 重启某个进程
stop xxx: 停止某一个进程(xxx),xxx为[program:theprogramname]里配置的值
stop groupworker: 重启所有属于名为groupworker这个分组的进程(start,restart同理)
stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文
reread,当一个服务由自动启动修改为手动启动时执行一下就ok

直接输入:supervisorctl 进入supervisorctl 的shell交互界面,上面的命令不带supervisorctl 可直接使用

3.3. 其它功能

除了 supervisorctl 之外,还可以配置 supervisrod 启动 web 管理界面,这个 web 后台使用 Basic Auth 的方式进行身份认证。
它可能导致CPU使用率高,一般不用。

除了单个进程的控制,还可以配置 group,进行分组管理。

经常查看日志文件,包括 supervisord 的日志和各个 pragram 的日志文件,程序 crash 或抛出异常的信息一半会输出到 stderr,可以查看相应的日志文件来查找问题。

3.4. supervisor开机自动启动

在目录/usr/lib/systemd/system/ 新建文件supervisord.service,并添加配置内容

  
[Unit]  
Description=Process Monitoring and Control Daemon  
After=rc-local.service nss-user-lookup.target  

[Service]  
Type=forking  
ExecStart=/usr/bin/supervisord -c /usr/supervisor/supervisord.conf ;开机启动时执行  
ExecStop=/usr/bin/supervisord shutdown  
ExecReload=/usr/bin/supervisord reload  
killMode=process  
Restart=on-failure  
RestartSec=42s  

[Install]  
WantedBy=multi-user.target  

启动服务
systemctl enable supervisord
验证一下是否为开机启动
systemctl is-enabled supervisord

4. 问题

  1. unix:///var/run/supervisor/supervisor.sock no such file
    问题描述:安装好supervisor没有开启服务直接使用supervisorctl报的错
    解决办法:supervisord -c /etc/supervisord.conf

  2. command中指定的进程已经起来,但supervisor还不断重启
    问题描述:command中启动方式为后台启动,导致识别不到pid,然后不断重启,本人使用的是elasticsearch,command 指定的是$path/bin/elasticsearch -d,踩到的坑
    解决办法:supervisor无法检测后台启动进程的pid,而supervisor本身就是后台启动守护进程,因此不用担心这个

  3. 启动了多个supervisord服务,导致无法正常关闭服务
    问题描述:在运行supervisord -c /etc/supervisord.conf 之前,我直接运行过supervisord -c /etc/supervisord.d/xx.conf ,导致有些进程被多个superviord管理,无法正常关闭进程。
    解决办法: 使用 ps -fe | grep supervisord 查看所有启动过的supervisord服务,kill相关的进程。

  4. Unlinking stale socket /tmp/supervisor.sock
    强制结束supervisord进程后再启动时会遇到该问题
    unlink /tmp/supervisor.sock

  5. supervisorctl error (no such process)
    修改supervisor.conf时注意include行前也有冒号,需要删除。

posted @ 2020-11-01 23:16  木林森__𣛧  阅读(347)  评论(0)    收藏  举报