进程管理工具 Supervisor


要想在终端后台常驻进程,首先想到的是在指令后加 & 符号,来到达躲藏程序在后台的目的,尽管看起来进程现已在后台工作了,实际上终端会话关闭时进程仍是会被 kill 掉,这种问j * E题一般是采用分配 nohup 指令来处理的,nohup 作用是忽略 SIGHUP 信号,而会话关闭时正好发R t V H R [送了该信号给会话内全部工作程序,简而言之,nohup 指令分配 & 不仅可以在后8 M U f 2 M 2台工作,还不受会话关闭z f ( – G Y V #的影响。

$ nohup /bin/cat &

那么问题来了,尽管做到了后台工作,也避免了挂断操作带来的影响,可是它避免不了常驻进程自己出现问题,一旦o K _它因本身失常停止了J Q g进程,这对黄金搭档就无力回天了。那怎么才能把挂了的常驻进程拉起来呢?这便~ V ,是我们要讲的主题 Supervisor。8 } w l n ] E }

Supervisor 介绍

Supervisor 是专门用来在类 Unix 体系上监控处理进程的东西,发布于 2O e E : n z004 年,尽管姓名气势磅礴,但它的志向并不是统筹整个操作体系的进程,而是致力于做一个A 4 k ^听话的贴身助理,你只需求告知它要处理的程序,它就按你的要求监控进程,治病救人,确保进程的继续工作。

类 Unix 体系就是由 Unix 规划风格演变出的操作体系,除了 Windows 市面上绝大多数体系都是类 Unix 体系。

官方文档介绍 SupH 9 l m {ervisor 是 C/S 架构体系,它3 q k F对应的人物分别为V 7 A J Supervisorctl 和 Supervisord。后者的首要作用是发起配备好的程序、呼应 Supervisorctl 发过来的指令以及重启退出的子进程,而前者是 Supervisor 的客户端[ w R,它以指令行的方法供应了a # D . I U 9 T *一系列参数,来便使用户向 Supervip r Nsord 发送指令,常用的有发起、暂停、移除、更新等指令。

Supervisor 设备与装: 2 C

设备 Supervisor 很简略,在各大操作体系的软件包A _ ?处理器中都可以直接设备。

$ yu; P & k E ]m install -y supervisor

设备好的 Supervisor 配备文件/ C j B E (默认为 /etc/supervisor.conf,假设找不到配备文件可以通过官方指令生成,该配备文件包含了一个空的配备目录 /etc/supervisor.d(不同 OS 或许不一样),只需在该目录添加配备文件即可动态扩展,所以 supervisor.conf 一般) k s S d不需求做改动。

我们以最简略的 cat 指令为例,cat 指令不加参数会阻塞住等待标准输入,所以很适合做常驻进程的演示。现在创建一个^ , s I ;配备文件 cat.ini 到 /et[ = a / ! f w Dc/supervisor.d/,第一行界说程序的称谓,该称谓用来做操作的标识,第二行界说指令k x c ! o ] m 1 *路径,它才是程序实行的底子指令。

[program:foo]
command=/bin/cat

配备好后,发起 supervisord 服务,留意通过 -c 指定 supervisor 的配备文件。

$ s: x # C ( n z dupervisord -c /etC . Z V ^ 4 3 $ jc/supZ e & - ,ervisord.conf[ : / e 7 y @

当然也可以不指定配备路径,那么它会按以下次第逐个搜索配备文件:

  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf
  • /em t ( b { 1 h ltc/supervisor/supervisord.conf
  • ../etc/supD Q B Q I o )ervisord.conf
  • ../supervisord.conf

假设你是通过 Mac OS 设备的 Supervisor,或许从上述目录都找不到q * X v R U配备文件,可以使用官方供应的指令生成配备。

$ echo_supervo p t R H 2isord_conf > supervisorN L 1 H 4 j.conf

这个时候 c^ L h I oat 进程应该现已跑起来G I : R t v了。

$ ps aux | grep /bin/cat

杀掉进程,进程 id 会发生变化,证明 supervisor 又把 cat 拉d A s 4了起来。

$ sudo kill 9 <进程ID>

中心配备解说

配备r 0 D文件中的选项并不止 command,官方供应了许多配备项。

[program:name]
command=sh /tmp/echo_time.sh
priority=999
numprD R A qocm E ) [ E M fs=1
autostart=true
autorestart=true
startsecs=10
startretries=3
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=rv U 7 Hoot
log_stdout=true
log_stdy Y S m : verr=true
logfile=/tmp/echo_time.log
logfile_maxbyW b l b I q : Etes=1MB
logfile_backups=10
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile=/tmp/echo_time.stdout.log

下面选择几个配备扼要说明

  • command:要实行的指令
  • priority:实行优先级,值越0 P * 6高就j : 0越晚发起,越早关闭
  • numprocs:进程数量
  • autostart:是否与 supervisord 一同] a |发起
  • autorestA s Z fart:主动重启
  • startsecs:延时发起时刻,默认为 10 秒
  • startretries:发起重试次数,默认为 3 次
  • exitcodes:当程序的退出码为 0 或 2 时,重启
  • stopsignal:间断信号
  • stopwaitsec| A H / y , +s:延时刻断时刻,收到间断指令! 1 A N 2 Q O后多久* A y J 7间断
  • u# h ; v ~ , v { cser:以哪个用户实行

动态操作子程序

添加新的程序,只需添加配备文件,然后实行 supeV { : # j Rrvisorctl update 即可动态添加新的程序,并不需求I % O重启 supervisord 服务。假设出现 refusec ? T s Od connection 的提示,或许是没找到配备文件,需求加上配备选项。

$ supervisorctl update
foo1: adw ! m U s S ! tded process group

删去同理,remoW h 3 _ 6 Pve 时会先将进程关闭,再从列表中移除。

foo1: stopped
foo1: removed prg ! * w V . `ocess group

假设需求独自间断某个程序,可以使用 stop 指令,stop 后跟的是 program 称谓。

$ suF , H wpervisorcu . C Gtl stop fooa a r O
foo: stopped

当然还可以经b f过 stop all 指令更加暴力的间断全部进程。

$ supervisorctl stop all
foo: stopped
foo1: s+ & = Q C [ ; Dtopped

反之亦然,发起进程只需求将 stop 改为 stay $ drt。

$ supervisorctl start all

连接到某个进程

$ super@ U W a 6 vvisorctl fgo [ w F 1 M s ( , <program 称谓>

重启 supervisord

$ supervisorctl reload

动态加载 supervisor.conf

$ supervisorctl reread

检查全部s j A = h @进程工作状况

$ supervisorctl status

Web 界面操作

官方供应了界面操作方法,需求在 supervisor.cJ j S 4 Xonf 中去掉 inet_http_server 的注释。

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9001        ; ip_address:port spa ) Y $ a cecifier, *:port for all iface
username=user              ; default is no userna3 * [ P = @ J f Ume (open server)
password=123               ; default is no password (open server)

重启 supervisord。

$ supervisorctl reload

访问 http://localhost:9001 可以看到 supervisor 的操作界面。


我是平也,这有一个M & } t N m q专注Gopher技术成长的开源项目「go hom. M i we」


感谢我们的观看,假设觉得文章对你有所帮助,欢迎关注大众号「平也」,聚集Go言语与技术原理。

发表评论

提供最优质的资源集合

立即查看 了解详情