Python supervisor强大的进程管理工具的使用


Posted in Python onApril 24, 2019

本文主要跟大家分享在类unix操作系统下supervisor的使用以及一些关于进程的知识

一、问题背景

1、背景

如何才能让一个进程摆脱终端,获得相对较长的生命周期?

2、后台(守护)、前台进程

​什么是守护进程?通俗点讲就是后台跑着的进程,不会因为你关了终端服务就会随之停止,直到你把计算机的电源关闭。当进程变为后台进程后,同一个终端就会释放了,你可以在其中干别的事情,而不会干扰到你跑的服务。后台进程一般来说不能捕捉输入,服务的输出依然可以选择在终端输出。

同样的道理,理解前台进程就简单多了,前台进程就是你的一个服务在跑,但是不能再在同一个终端干别的事情,必须把你现有的服务给停掉之后才可以继续干别的事,前台进程可以捕捉输入、输出。

3、如何将前台进程启动为后台进程

用过Python Django进行过开发的朋友一定会在自己本地的环境中跑过项目。如下图,这样跑起来的服务,我们通常称为前台进程,这个时候在此终端,你不能干别的事,当然这么做一般都是用来看打印在终端的调试信息,但是在远程服务器上呢?情况就不一样了吧。

Python supervisor强大的进程管理工具的使用

下面是用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)

在终端下,把应用跑起来

$ python server.py

Python supervisor强大的进程管理工具的使用

出现上图所示,访问http://localhost:8090/,浏览器就出现"hello world",这时,ctrl+c后在访问就会报错了。下面演示如何将该进程启动为后台进程

(1)依然可以在终端输出的后台进程,就在命令行后加上&符号,依然可访问

$ python server.py &

Python supervisor强大的进程管理工具的使用

Python supervisor强大的进程管理工具的使用

可以看到终端依然捕捉到输出

Python supervisor强大的进程管理工具的使用​  

(2) 使用nohup命令结合&符号,该命令会在当前目录下生成nohup.out文件,此文件保存着本该终端打印出来的信息,如下图所示

$ nohup python server.py &

Python supervisor强大的进程管理工具的使用

4、如何辨别后台进程

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

$ ps aux

Python supervisor强大的进程管理工具的使用

TT列为??的为后台进程,没有得就是前台进程,前台进程还有个明显的标记就是有个''+"号

5、存在的问题

上述启动为后台进程的方法,其实是存在很多问题的。

(1)从项目的角度看,一个项目往往不止起一个进程,还可能有其他的进程,那么,如何进行统一的进程管理呢?

(2)在进程运行的过程中,因为某种原因,挂掉了,如何做到不用人为干预自动重启进程呢?

supervisor完美解决上面的两个问题,当然可能还有更为强大的功能。

二、什么是supervisor

1、定义

Supervisor是用Python编写的目前只能在类unix操作系统中使用的一个进程管理工具。

注意,是一个管理工具,并不是库或包。

2、作用

Supervisor进程管理工具可以高效简单地对单个或者多个进程进行统一管理,如启动、重启、停止进程。更重要的作用是能在进程因为某种原因崩溃时,做到自动重启

3、Supervisor的组成

Supervisor主要由以下两部分组成:

(1)supervisord:

当我们启动Supervisor时,首先会有一个supervisord进程,称为父进程,它所管理的进程是它的子进程。supervisord进程负责统一管理这些子进程的启动、重启、停止。某种角度上看,有点NGINX的master与worker的感觉吧。

(2)supervisorctl:

一个命令行管理工具,输入某些命令,如:start、stop、restart等,就可以对指定的进程进行相应的操作了,极其简单。

如何简单地理解?

可以将supervisord理解为服务器,supervisorctl理解为客户端,输入的一些命令可以看做是客户端与服务器的交互过程。更牛逼的是Supervisor提供了web api在浏览器上就可以直接进行对进程的可视化管理。

接下来,在使用Supervisor进程管理工具前,先来看看一些配置项,当然安装好Supervisor之后,它的配置文件里已经有很详细的注释了,这里主要介绍子进程的配置文件的配置参数。下图就是三个子进程的配置文件,为什么要拿子进程的配置出来,形成一个独立的配置文件呢?当然是为了维护方便,就像很多人用NGINX一样,把配置文件按模块进行管理

Python supervisor强大的进程管理工具的使用

子进程配置文件的示例

Python supervisor强大的进程管理工具的使用​  

常用配置参数说明:

配置项 说明
directory 就是你项目所在的位置,supervisord会自动切换到这个目录
command 你跑项目的命令
user 你用什么身份起进程
autostart 当设置为true时,当supervisord启动时,该子进程就会自动启动
autorestart 当设置为true时,子进程因为某种原因挂掉,会自动进行重启
startsecs 该子进程启动多久后,才认为进程启动成功
startretries 子进程尝试情动的次数,默认为3
redirect_stderr 当设置为true时,子进程的标准错误输出重定向到supervisord后台的标准输出文件描述符
stdout_logfile 子进程标准输出存放的路径
stdout_logfile_maxbytes 标准输出文件达到多少后进行轮转
stdout_logfile_backups 标准输出日志的备份数量
priority 子进程启动的优先级,值越小启动越早

接下来,就是怎么用Supervisor的问题了

三、如何使用supervisor

1、安装Supervisor

两种方式进行安装

$ brew install supervisor #(本人机子是MAC,其他类unix操作系统的发行版本,自行使用相应的软件管理命令)
$ pip install supervisor

注意:supervisor只运行在python2.4以上的版本,但是不支持Python3.X,如果你的机子没有相应的版本就Google一下解决办法吧

安装完成之后,我的是默认的安装路径

$ cd /usr/local/etc/

Python supervisor强大的进程管理工具的使用
​ 

上图所示的supervisord.ini文件就是安装后产生的文件,supervisor.d是我自己自自建的文件夹,这个待会说。

linux操作系统的是安装路径

Python supervisor强大的进程管理工具的使用

我们先来看看supervisord.ini是什么?

2、编辑配置文件

$ cat -n supervisord.ini

可以看到大概有148行,有9个配置选项

Python supervisor强大的进程管理工具的使用

Python supervisor强大的进程管理工具的使用

Python supervisor强大的进程管理工具的使用

上图中画红色横线的地方要注意,有些人的supervisord.pid 以及 supervisor.sock 是放在 /tmp 目录下,这个目录是放临时文件的,容易丢失,强烈建议改目录放置,建议放在/var/run/下。

别看这supervisord.ini配置文件一大推东西,其实真正需要配的地方很少,本人就只是选用了第二个框的配置项,这里还提一下【include】配置项,跟NGNIX的配置文件如出一辙,意思是:我这里配置文件还包含了这个目录下的所有配置文件。还记得上本提到的supervisor.d目录吗?里面可以放置很多**.ini文件,而这些.ini**的文件其实很简单,仅仅包含了上图中的第六个配置项,这样就达到一个子进程一个配置文件,方便进行维护的目的。

$ ls supervisor.d/

Python supervisor强大的进程管理工具的使用

$ vim server2.py

Python supervisor强大的进程管理工具的使用
​ 

上图的红框的内容,其实就是主配置文件中的第六个框的配置项,只是把它抽出来,形成独立的配置文件,达到分而治之的目的。

以上就配置好了两个子进程,接下来就是跑起来了

3、启动supercisord

$ supervisord -c /usr/loacl/etc/supervisord.ini #注意:要以配置文件的方式开启服务

Python supervisor强大的进程管理工具的使用

上图的现象是因为我已经启动了supervisord进程,下面通过supervisorctl命令行工具进行进程管理

4、使用supervisorctl进行进程管理

进入supervisorctl交互界面,也要以带有配置文件的方式进入,这样才会跟踪到配置

$ supervisorctl -c /usr/local/etc/supervisord.ini

Python supervisor强大的进程管理工具的使用​  

上图的现象是因为我把代码切换到了一个正在开发的分支上

supervisor> help #查看命令

Python supervisor强大的进程管理工具的使用

于是乎,可以根据命令自由地对子进程进行管理。

下表是一些常用的命令:

常用的命令 说明
status 查看当前管理的子进程
reload 当配置发生改变时,进行热部署
restart [program_name] 重启某个子进程
start [program_name] 启动某个子进程

5、可以通过web页面进行进程可视化进程管理

使用浏览器访问127.0.0.1:9001,进入管理可视化界面

Python supervisor强大的进程管理工具的使用

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Debian下配置Python+Django+Nginx+uWSGI+MySQL的教程
Apr 25 Python
python嵌套字典比较值与取值的实现示例
Nov 03 Python
python re模块findall()函数实例解析
Jan 19 Python
Python数据预处理之数据规范化(归一化)示例
Jan 08 Python
Python语言检测模块langid和langdetect的使用实例
Feb 19 Python
多版本python的pip 升级后, pip2 pip3 与python版本失配解决方法
Sep 11 Python
python实现根据给定坐标点生成多边形mask的例子
Feb 18 Python
Python图像处理库PIL的ImageEnhance模块使用介绍
Feb 26 Python
python 中的paramiko模块简介及安装过程
Feb 29 Python
通过代码实例了解Python异常本质
Sep 16 Python
Python __slots__的使用方法
Nov 15 Python
Pandas 稀疏数据结构的实现
Jul 25 Python
python3爬虫学习之数据存储txt的案例详解
Apr 24 #Python
Python3.5面向对象编程图文与实例详解
Apr 24 #Python
Python对ElasticSearch获取数据及操作
Apr 24 #Python
Python3.5面向对象与继承图文实例详解
Apr 24 #Python
Python3.5基础之NumPy模块的使用图文与实例详解
Apr 24 #Python
基于python的ini配置文件操作工具类
Apr 24 #Python
python实现简单日期工具类
Apr 24 #Python
You might like
使用一个for循环将N*N的二维数组的所有值置1实现方法
2017/05/29 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
JavaScript中关于indexOf的使用方法与问题小结
2010/08/05 Javascript
jQuery创建平滑的页面滚动(顶部或底部)
2013/02/26 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
jQuery使用CSS()方法给指定元素同时设置多个样式
2015/03/26 Javascript
JavaScript实现页面无操作倒计时退出
2016/10/22 Javascript
使用BootStrap建立响应式网页——通栏轮播图(carousel)
2016/12/21 Javascript
Vuex和前端缓存的整合策略详解
2017/05/09 Javascript
jQuery 1.9版本以上的浏览器判断方法代码分享
2017/08/28 jQuery
vue-router+vuex addRoutes实现路由动态加载及菜单动态加载
2017/09/28 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
集成vue到jquery/bootstrap项目的方法
2018/02/10 jQuery
vue小白入门教程
2018/04/02 Javascript
Node.js fs模块(文件模块)创建、删除目录(文件)读取写入文件流的方法
2019/09/03 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
2020/01/17 Javascript
[51:36]Optic vs Newbee 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/18 DOTA
[42:11]TNC vs Pain 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/20 DOTA
Python中random模块用法实例分析
2015/05/19 Python
django批量导入xml数据
2016/10/16 Python
Python使用pyodbc访问数据库操作方法详解
2018/07/05 Python
OpenCV模板匹配matchTemplate的实现
2019/10/18 Python
PyTorch加载预训练模型实例(pretrained)
2020/01/17 Python
如何基于matlab相机标定导出xml文件
2020/11/02 Python
使用postMessage让 iframe自适应高度的方法示例
2019/10/08 HTML / CSS
mysql有关权限的表都有哪几个
2015/04/22 面试题
工厂厂长的职责
2013/12/12 职场文书
CAD制图设计师自荐信
2014/01/29 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
工程造价专业求职信
2014/07/17 职场文书
小学生五年级大队长竞选发言稿
2014/09/12 职场文书
九一八事变演讲稿范文
2014/09/14 职场文书
车间班组长竞聘书
2015/09/15 职场文书
财务会计个人原因辞职信
2019/06/21 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
深入理解python协程
2021/06/15 Python