历程管理工具 Supervisor

要想在终端后台常驻历程,首先想到的是在下令后加 & 符号,来到达隐藏程序在后台的目的,只管看起来历程已经在后台运行了,实际上终端会话关闭时历程照样会被 kill 掉,这种问题一样平常是接纳搭配 nohup 下令来解决的,nohup 作用是忽略 SIGHUP 信号,而会话关闭时正好发送了该信号给会话内所有运行程序,简而言之,nohup 下令搭配 & 不仅可以在后台运行,还不受会话关闭的影响。

$ nohup /bin/cat &

历程管理工具 Supervisor

那么问题来了,虽然做到了后台运行,也避免了挂断操作带来的影响,然则它避免不了常驻历程自己泛起问题,一旦它因自身异常终止了历程,这对黄金搭档就无力回天了。那怎么才能把挂了的常驻历程拉起来呢?这就是我们要讲的主题 Supervisor。

Supervisor 先容

Supervisor 是专门用来在类 Unix 系统上监控治理历程的工具,公布于 2004 年,虽然名字气势磅礴,但它的志向并不是统筹整个操作系统的历程,而是致力于做一个听话的贴身助理,你只需要告诉它要治理的程序,它就按你的要求监控历程,救死扶伤,保证历程的连续运行。

历程管理工具 Supervisor

类 Unix 系统就是由 Unix 设计气概演变出的操作系统,除了 Windows 市面上绝大多数系统都是类 Unix 系统。

官方文档先容 Supervisor 是 C/S 架构系统,它对应的角色分别为 Supervisorctl 和 Supervisord。后者的主要作用是启动设置好的程序、响应 Supervisorctl 发过来的指令以及重启退出的子历程,而前者是 Supervisor 的客户端,它以下令行的形式提供了一系列参数,来利便用户向 Supervisord 发送指令,常用的有启动、暂停、移除、更新等下令。

Supervisor 安装与设置

安装 Supervisor 很简朴,在各大操作系统的软件包治理器中都可以直接安装。

$ yum install -y supervisor

安装好的 Supervisor 设置文件默以为 /etc/supervisor.conf,若是找不到设置文件可以通过官方下令天生,该设置文件包含了一个空的设置目录 /etc/supervisor.d(差别 OS 可能不一样),只需在该目录添加设置文件即可动态扩展,以是 supervisor.conf 一样平常不需要做改动。

我们以最简朴的 cat 下令为例,cat 下令不加参数会阻塞住守候尺度输入,以是很适合做常驻历程的演示。现在建立一个设置文件 cat.ini 到 /etc/supervisor.d/,第一行界说程序的名称,该名称用来做操作的标识,第二行界说下令路径,它才是程序执行的基本下令。

[program:foo]
command=/bin/cat

设置好后,启动 supervisord 服务,注重通过 -c 指定 supervisor 的设置文件。

$ supervisord -c /etc/supervisord.conf

固然也可以不指定设置路径,那么它会按以下顺序逐个搜索设置文件:

  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf
  • /etc/supervisor/supervisord.conf
  • ../etc/supervisord.conf
  • ../supervisord.conf

若是你是通过 Mac OS 安装的 Supervisor,可能从上述目录都找不到设置文件,可以行使官方提供的下令天生设置。

利用 tee 命令调试shell脚本中的管道

$ echo_supervisord_conf > supervisor.conf

这个时刻 cat 历程应该已经跑起来了。

$ ps aux | grep /bin/cat

杀掉历程,历程 id 会发生变化,证实 supervisor 又把 cat 拉了起来。

$ sudo kill 9 <历程ID>

焦点设置解说

设置文件中的选项并不止 command,官方提供了许多设置项。

[program:name]
command=sh /tmp/echo_time.sh
priority=999
numprocs=1
autostart=true
autorestart=true
startsecs=10
startretries=3 
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=10
user=root
log_stdout=true
log_stderr=true
logfile=/tmp/echo_time.log
logfile_maxbytes=1MB
logfile_backups=10 
stdout_logfile_maxbytes=20MB 
stdout_logfile_backups=20 
stdout_logfile=/tmp/echo_time.stdout.log

下面挑选几个设置简要说明

  • command:要执行的下令
  • priority:执行优先级,值越高就越晚启动,越早关闭
  • numprocs:历程数目
  • autostart:是否与 supervisord 一起启动
  • autorestart:自动重启
  • startsecs:延时启动时间,默以为 10 秒
  • startretries:启动重试次数,默以为 3 次
  • exitcodes:当程序的退出码为 0 或 2 时,重启
  • stopsignal:住手信号
  • stopwaitsecs:延时住手时间,收到住手指令后多久住手
  • user:以哪个用户执行

动态操作子程序

添加新的程序,只需增添设置文件,然后执行 supervisorctl update 即可动态添加新的程序,并不需要重启 supervisord 服务。若是泛起 refused connection 的提醒,可能是没找到设置文件,需要加上设置选项。

$ supervisorctl update
foo1: added process group

删除同理,remove 时会先将历程关闭,再从列表中移除。

foo1: stopped
foo1: removed process group

若是需要单独住手某个程序,可以使用 stop 下令,stop 后跟的是 program 名称。

$ supervisorctl stop foo
foo: stopped

固然还可以通过 stop all 下令加倍暴力的住手所有历程。

$ supervisorctl stop all
foo: stopped
foo1: stopped

反之亦然,启动历程只需要将 stop 改为 start。

$ supervisorctl start all

连接到某个历程

$ supervisorctl fg <program 名称>

重启 supervisord

$ supervisorctl reload

动态加载 supervisor.conf

$ supervisorctl reread

查看所有历程运行状况

$ supervisorctl status

Web 界面操作

官方提供了界面操作方式,需要在 supervisor.conf 中去掉 inet_http_server 的注释。

[inet_http_server]         ; inet (TCP) server disabled by default
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。

$ supervisorctl reload

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

历程管理工具 Supervisor

我是平也,这有一个专注Gopher手艺发展的开源项目「go home」

谢谢人人的旁观,若是以为文章对你有所辅助,迎接关注民众号「平也」,聚焦Go语言与手艺原理。
历程管理工具 Supervisor

原创文章,作者:admin,如若转载,请注明出处:https://www.2lxm.com/archives/6494.html