使用supervisor实现进程管理

去年做一个项目,涉及大量脚本操作,然后了解到了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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值