去年做一个项目,涉及大量脚本操作,然后了解到了supervisor这个工具,可以非常方便的实现脚本运行的管理,从而大大解放了人力;前几天又被问到相关配置,有点忘记了,写个文档简单整理下。
0x01 介绍
supervisor 是一个基于 python 的进程管理工具,提供了统一的方式方便地执行进程启动、关闭、重启操作。
这个工具的原理就是通过 fork/exec
的方式将待管理的进程作为自己的子进程来启动,这样子进程挂掉时,父进程就可以获取子进程的相关信息,然后做相应的处理。
简单理解,就是把普通的命令行进程转化为一个后台的守护进程,然后监控这个进程的状态并提供管理操作(最常用的就是自动重启hhh)。
实现这一切功能,我们只需要装一个superviosr工具,然后做简单的配置,其他的都已经实现好了。
支持运行平台是 Linux/UNIX/MacOS ,不支持 Windows
0x02 安装
安装非常简单,因为基于python,已经有现成的包了,直接用pip
安装
pip3 install superviosr
安装后就可以使用以下三个命令
echo_supervisord_conf
supervisorctl
supervisord
supervisor 是一个 C/S 架构的程序,服务端是 superviosrd,客户端是 supervisorctl,可以使用这两个命令执行相关的操作,echo_supervisord_conf 是额外的一个方便配置的工具
0x03 配置
supervisor 的配置包含两部分,superviosrd 的配置和应用进程的配置
1、supervisord
supervisord 是 supervisor 的主进程,也是进程管理的 server,它会根据配置文件创建应用程序子进程,管理子进程的整个生命周期。
supervisord 还内置 web server 和 XML-RPC Interface,方便实现远程进程管理。
使用 echo_supervisord_conf 可以查看默认配置,我们直接输出或重定向到一个配置文件
echo_supervisord_conf > ./supervisord.conf
sudo mv ./supervisord.conf /etc/supervisor/supervisord.conf
对其中有用的配置内容进行说明
[unix_http_server] ; 配置一个监听在 socket 上的 Http Server
file=/tmp/supervisor.sock ; UNIX socket 文件,C/S 架构通信用的
;chmod=0700 ; socket file mode (default 0700)
;chown=nobody:nogroup ; socket file uid:gid owner
;username=user ; default is no username (open server)
;password=123 ; default is no password (open server)
[inet_http_server] ; 配置一个监听在 TCP 上的 Http Server,提供 web 管理
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
;username=user ; default is no username (open server)
;password=123 ; default is no password (open server)
[supervisord] ; supervisord 进程的全局配置
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
minfds=1024 ; min. avail startup file descriptors; default 1024
minprocs=200 ; min. avail process descriptors;default 200
;umask=022 ; process file creation umask; default 022
;user=supervisord ; setuid to this UNIX account at startup; recommended if root
;identifier=supervisor ; supervisord identifier, default is 'supervisor'
;directory=/tmp ; default is not to cd during start
;nocleanup=true ; don't clean up tempfiles at start; default false
;childlogdir=/tmp ; 'AUTO' child log dir, default $TEMP
;environment=KEY="value" ; key value pairs to add to environment
;strip_ansi=false ; strip ansi escape codes in logs; def. false
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl] ; 配置一个监听在 socket 上的 Http Client
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
; 通过上面 inet_http_server 中的配置连接 supervisord
serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
; 通过HTTP直接访问URL连接
;username=chris ; should be same as in [*_http_server] if set
;password=123 ; should be same as in [*_http_server] if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available
[include] ; 用来包含其他的配置文件,如应用程序配置
files = ./conf.d/*.ini ; 配置文件地址,支持 ini 和 conf
启动 supervisord,通过 -c 指定配置文件路径,不指定时会按照默认路径依次查找
superviosrd [-c /etc/supervisor/supervisord.conf]
查看运行的进程
ps aux | grep supervisord
还可以通过 inet_http_server 中配置的 web 服务查看进程相关信息,访问 localhost:9001 ,注意配置了用户名密码访问时需要输入
2、program
应用程序的配置文件可以直接写到 supervisord 的配置文件中,如果程序较多,最好分别写到不同的文件中然后 include 进来,需要修改包含路径的配置
[include]
files = ./conf.d/*.ini
应用程序配置文件为
[program:demo] ; 监控程序的配置项
; program 关键字,指明应用程序的唯一标志
directory = /directory/of/demo ; 程序的启动目录
command = command to start demo ; 启动命令
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就认为已经正常启动
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
user = leon ; 用哪个用户启动
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数
stdout_logfile = /log/file/name ; stdout 日志文件,supervisord 会自动创建
3、supervisorctl
对应 supervisord 的一个客户端命令行工具,提供类似 shell 的操作接口,可以连接到不同的 supervisord 进程管理各自的应用程序,通过 UNIX sock 或者 TCP 与服务端通信
进入 shell 界面
superviosrctl [-c /etc/supervisor/supervisord.conf]
命令
> status # 查看程序状态
> stop [demo] # 关闭 demo 程序
> start [demo] # 启动 demo 程序
> restart [demo] # 重启 demo 程序
> reread # 读取有更新(增加)的配置文件,不会启动新添加的程序
> update # 重启配置文件修改过的程序
> reload # 重新启动配置中的所有程序
启动
可以将 supervisor 设置为跟随系统启动,如 Linux 启动时会执行 /etc/rc.local 脚本,添加启动命令
supervisord -c /etc/supervisor/supervisord.conf