关于进程管理工具 Supervisord 的使用

发布时间 2023-07-11 21:37:02作者: 2gbxzhdaz

http://www.supervisord.org/


# 它是由Python实现的进程管理工具,只能管理在前台运行的程序,若应用有后台运行的选项则需要关闭
# 可以很方便的用来启动、重启、关闭进程,除了对单个进程控制外,还可以同时启停多个进程
# 例如服务器故障导致所有应用被杀,此时可用其同时启动所有应用而不必一个个地敲命令启动 ...
# 当进程挂掉时Linux不会自动重启,想要自动重启的话还要自己写监控重启脚本,而supervisor可以完美解决这些问题
# Supervisor 通过 "fork/exec" 的方式将这些被管进程作为其子进程来启动
# 因此只要在supervisor的配置中把要管理的进程的可执行文件的路径写入即可,省下了Linux管理进程时写控制脚本的麻烦
# supervisor 可以对进程组统一管理,也就是说可以把需要管理的进程写到一个组里面
# 然后把这个组作为一个对象进行管理,如启动,停止,重启等操作...

# ------------------------------------------------------------------------- SETUP

# 方式1
# pip install supervisor

# 方式2
# 从 PyPi 下载并解压后运行: python setup.py install

# 安装后执行如下命令生成默认配置项
echo_supervisord_conf > /etc/supervisord.conf

# 运行
supervisord -c /etc/supervisord.conf
ps aux | grep supervisord

# supervisord 配置文件的默认读取路径:
#   $CWD/supervisord.conf
#   $CWD/etc/supervisord.conf
#   /etc/supervisord.conf
#   /etc/supervisor/supervisord.conf(Supervisor 3.3.0+)
#   ../etc/supervisord.conf(相对于可执行文件)
#   ../supervisord.conf(相对于可执行文件)

# -------------------------------------------------------------------------

# 关于supervisor的运行参数
# http://www.supervisord.org/running.html#supervisord-command-line-options

# 关于supervisorctl的运行参数
# http://www.supervisord.org/running.html#supervisorctl-command-line-options

/etc/supervisord.conf


[unix_http_server]              ; 非必须
file=/tmp/supervisor.sock       ; UNIX socket 文件,由 supervisorctl 命令使用 (建议修改为 /var/run 目录,避免被系统删除)
chmod=0700                      ; socket 文件的 mode,默认: 0700
chown=nobody:nogroup            ; socket 文件的 owner,格式:  uid:gid
username = chris                ;
password = 123                  ;

[inet_http_server]              ; supervisor 的HTTP服务,提供 UI 管理界面
port=127.0.0.1:9001             ; HTTP服务监听的IP+端口,若开放到公网需注意安全
username= chris                 ; 登录管理后台的用户名
password=123                    ; 登录管理后台的密码

[supervisorctl]                 ; 与supervisorctl相关的配置
serverurl = unix:///tmp/supervisor.sock ; supervisorctl 通过其连接 supervisord,路径与 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001        ; 通过 HTTP 的方式连接 supervisord
username = chris
password = 123
prompt = mysupervisor           ; 用作超级用户提示的字符串

[supervisord]
nodaemon = true                 ; 当在Docker容器内用于管理后台守护进程时需将Supervisor设为前台启动
logfile = /tmp/supervisord.log  ; 日志文件,默认是 $CWD/supervisord.log (建议改为 /var/log 目录)
logfile_maxbytes = 50MB         ; 日志大小,超出会 rotate,默认 50MB
logfile_backups=10              ; 日志文件保留备份数量,默认 10
loglevel = info                 ; 日志级别,默认 info,其它: debug,warn,trace
pidfile = /tmp/supervisord.pid  ; 建议改为 /var/run 目录
minfds = 1024                   ; 可以打开的文件描述符的最小值,默认 1024
minprocs = 200                  ; 可以打开的进程数的最小值,默认 200
umask = 022                     ; 
user = chrism                   ; http://www.supervisord.org/configuration.html
directory = /tmp                ; 程序启动目录
childlogdir = /tmp              ;
strip_ansi = false              ;
environment = KEY1="value1",KEY2="value2"           ; 环境变量

[program:usercenter]                                ; usercenter 是应用的标识,对其的操作如 start、restart 等都通过此名字实现
directory = /home/leon/projects/usercenter          ; 程序启动目录、工作目录
command = gunicorn -w 8 -b 0.0.0.0:17510 --loglevel=%(ENV)s wsgi:app   ; 启动命令,可以是绝对或相对命令,其中%(ENV)s是读取环境变量
priority=1                                          ; 启动优先级
autostart = true                                    ; 在 supervisord 启动时是否也自动启动
autorestart = true                                  ; 程序异常退出后自动重启
startsecs = 5                                       ; 启动 5 秒后没有异常退出就当作已正常启动
startretries = 3                                    ; 启动失败后的重试次数,默认 3
exitcodes=0,2                                       ; 期望或者说预料中的进程退出码
stopsignal=TERM                                     ;
stopwaitsecs=10
environment=A="1",B="2"                             ; 环境变量
user = root                                         ; 由哪个用户身份启动
redirect_stderr = true                              ; 把 stderr 重定向到 stdout,默认 false
stdout_events_enabled=false                         ;
stdout_logfile_maxbytes = 20MB                      ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20                         ; stdout 日志文件备份数
stdout_logfile = /data/logs/usercenter_stdout.log   ; 日志文件,需注意当指定的日志路径中的目录不存在时无法正常启动,所以需手动创建目录

; 有时被托管的程序还会有子进程(如 Tornado),若只杀主进程,子进程就可能变成孤儿进程,通过以下两项配置来确保所有子进程都能正确停止
stopasgroup = true
killasgroup = true

[include]
files = relative/directory/*.ini                    ; 包含其他的配置文件,可以是 *.conf 或 *.ini

Groups


[group:thegroupname]  
; 这就是给programs分组,划分到组里的program就不用一个个去操作了,可使用组名进行统一操作
; program被划分到组后就相当于原来的配置从supervisor的配置文件里消失了,supervisor只会对组进行管理,而不再会对组里面的单个program进行管理了
programs=progname1,progname2                        ; 用逗号分隔的组成员,这是个必须的设置项
priority=999

supervisorctl


# Supervisorctl 是命令行客户端
# 启动时需要指定与 supervisord 使用相同配置文件,否则与 supervisord 按照一样的顺序查找配置文件

supervisorctl -c /etc/supervisord.conf
# supervisor> status                      # 查看程序状态
# supervisor> stop usercenter             # 关闭 usercenter 程序
# supervisor> start usercenter            # 启动 usercenter 程序
# supervisor> restart usercenter          # 重启 usercenter 程序
# supervisor> reread                      # 读取有更新(增加)的配置文件,不会启动新添加的程序
# supervisor> update                      # 重启配置文件修改过的程序

# 上面这些命令都有相应的输出,除进入supervisorctl的SHELL界面以外,也可直接在终端执行
# supervisorctl status
# supervisorctl stop usercenter
# supervisorctl start usercenter
# supervisorctl restart usercenter
# supervisorctl reread
# supervisorctl update