本文主要跟大家分享在类unix操作系统下supervisor的使用以及一些关于进程的知识
一、问题背景
1、背景
如何才能让一个进程摆脱终端,获得相对较长的生命周期?
2、后台(守护)、前台进程
什么是守护进程?通俗点讲就是后台跑着的进程,不会因为你关了终端服务就会随之停止,直到你把计算机的电源关闭。当进程变为后台进程后,同一个终端就会释放了,你可以在其中干别的事情,而不会干扰到你跑的服务。后台进程一般来说不能捕捉输入,服务的输出依然可以选择在终端输出。
同样的道理,理解前台进程就简单多了,前台进程就是你的一个服务在跑,但是不能再在同一个终端干别的事情,必须把你现有的服务给停掉之后才可以继续干别的事,前台进程可以捕捉输入、输出。
3、如何将前台进程启动为后台进程
用过Python Django进行过开发的朋友一定会在自己本地的环境中跑过项目。如下图,这样跑起来的服务,我们通常称为前台进程,这个时候在此终端,你不能干别的事,当然这么做一般都是用来看打印在终端的调试信息,但是在远程服务器上呢?情况就不一样了吧。

下面是用Python bottle写的一个最简单的web应用(bottle-轻量级框架,感兴趣的朋友可以去了解,pip install bottle可以安装)
进入终端
vim server.py
from bottle import route, run
@route("/")
def printStr():
return "hello world"
run(host="localhost", port=8090, debug=True)
在终端下,把应用跑起来
出现上图所示,访问http://localhost:8090/,浏览器就出现"hello world",这时,ctrl+c后在访问就会报错了。下面演示如何将该进程启动为后台进程
(1)依然可以在终端输出的后台进程,就在命令行后加上&符号,依然可访问


可以看到终端依然捕捉到输出
(2) 使用nohup命令结合&符号,该命令会在当前目录下生成nohup.out文件,此文件保存着本该终端打印出来的信息,如下图所示
$ nohup python server.py &

4、如何辨别后台进程
上面乱搞一通就变成了后台进程?别急,我们通过ps命令看一下

TT列为??的为后台进程,没有得就是前台进程,前台进程还有个明显的标记就是有个''+"号
5、存在的问题
上述启动为后台进程的方法,其实是存在很多问题的。
(1)从项目的角度看,一个项目往往不止起一个进程,还可能有其他的进程,那么,如何进行统一的进程管理呢?
(2)在进程运行的过程中,因为某种原因,挂掉了,如何做到不用人为干预自动重启进程呢?
supervisor完美解决上面的两个问题,当然可能还有更为强大的功能。
二、什么是supervisor
1、定义
Supervisor是用Python编写的目前只能在类unix操作系统中使用的一个进程管理工具。
注意,是一个管理工具,并不是库或包。
2、作用
Supervisor进程管理工具可以高效简单地对单个或者多个进程进行统一管理,如启动、重s://beijingoptbbs.oss-cn-hangzhou.aliyuncs.com/jb/2426819-f8cec9a1f746930fdafb0af31c28a341.png">
上图中画红色横线的地方要注意,有些人的supervisord.pid 以及 supervisor.sock 是放在 /tmp 目录下,这个目录是放临时文件的,容易丢失,强烈建议改目录放置,建议放在/var/run/下。
别看这supervisord.ini配置文件一大推东西,其实真正需要配的地方很少,本人就只是选用了第二个框的配置项,这里还提一下【include】配置项,跟NGNIX的配置文件如出一辙,意思是:我这里配置文件还包含了这个目录下的所有配置文件。还记得上本提到的supervisor.d目录吗?里面可以放置很多**.ini文件,而这些.ini**的文件其实很简单,仅仅包含了上图中的第六个配置项,这样就达到一个子进程一个配置文件,方便进行维护的目的。


上图的红框的内容,其实就是主配置文件中的第六个框的配置项,只是把它抽出来,形成独立的配置文件,达到分而治之的目的。
以上就配置好了两个子进程,接下来就是跑起来了
3、启动supercisord
$ supervisord -c /usr/loacl/etc/supervisord.ini #注意:要以配置文件的方式开启服务

上图的现象是因为我已经启动了supervisord进程,下面通过supervisorctl命令行工具进行进程管理
4、使用supervisorctl进行进程管理
进入supervisorctl交互界面,也要以带有配置文件的方式进入,这样才会跟踪到配置
$ supervisorctl -c /usr/local/etc/supervisord.ini
上图的现象是因为我把代码切换到了一个正在开发的分支上

于是乎,可以根据命令自由地对子进程进行管理。
下表是一些常用的命令:
常用的命令 |
说明 |
status |
查看当前管理的子进程 |
reload |
当配置发生改变时,进行热部署 |
restart [program_name] |
重启某个子进程 |
start [program_name] |
启动某个子进程 |
5、可以通过web页面进行进程可视化进程管理
使用浏览器访问127.0.0.1:9001,进入管理可视化界面

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持社区。 |