Python supervisor强大的进程管理工具的使用
作者:陈家大耳 发布时间:2021-04-15 09:11:58
本文主要跟大家分享在类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)
在终端下,把应用跑起来
$ python server.py
出现上图所示,访问http://localhost:8090/,浏览器就出现"hello world",这时,ctrl+c后在访问就会报错了。下面演示如何将该进程启动为后台进程
(1)依然可以在终端输出的后台进程,就在命令行后加上&符号,依然可访问
$ python server.py &
可以看到终端依然捕捉到输出
(2) 使用nohup命令结合&符号,该命令会在当前目录下生成nohup.out文件,此文件保存着本该终端打印出来的信息,如下图所示
$ nohup python server.py &
4、如何辨别后台进程
上面乱搞一通就变成了后台进程?别急,我们通过ps命令看一下
$ ps aux
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一样,把配置文件按模块进行管理
子进程配置文件的示例
常用配置参数说明:
配置项 | 说明 |
---|---|
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/
上图所示的supervisord.ini文件就是安装后产生的文件,supervisor.d是我自己自自建的文件夹,这个待会说。
linux操作系统的是安装路径
我们先来看看supervisord.ini是什么?
2、编辑配置文件
$ cat -n supervisord.ini
可以看到大概有148行,有9个配置选项
上图中画红色横线的地方要注意,有些人的supervisord.pid 以及 supervisor.sock 是放在 /tmp 目录下,这个目录是放临时文件的,容易丢失,强烈建议改目录放置,建议放在/var/run/下。
别看这supervisord.ini配置文件一大推东西,其实真正需要配的地方很少,本人就只是选用了第二个框的配置项,这里还提一下【include】配置项,跟NGNIX的配置文件如出一辙,意思是:我这里配置文件还包含了这个目录下的所有配置文件。还记得上本提到的supervisor.d目录吗?里面可以放置很多**.ini文件,而这些.ini**的文件其实很简单,仅仅包含了上图中的第六个配置项,这样就达到一个子进程一个配置文件,方便进行维护的目的。
$ ls supervisor.d/
$ vim server2.py
上图的红框的内容,其实就是主配置文件中的第六个框的配置项,只是把它抽出来,形成独立的配置文件,达到分而治之的目的。
以上就配置好了两个子进程,接下来就是跑起来了
3、启动supercisord
$ supervisord -c /usr/loacl/etc/supervisord.ini #注意:要以配置文件的方式开启服务
上图的现象是因为我已经启动了supervisord进程,下面通过supervisorctl命令行工具进行进程管理
4、使用supervisorctl进行进程管理
进入supervisorctl交互界面,也要以带有配置文件的方式进入,这样才会跟踪到配置
$ supervisorctl -c /usr/local/etc/supervisord.ini
上图的现象是因为我把代码切换到了一个正在开发的分支上
supervisor> help #查看命令
于是乎,可以根据命令自由地对子进程进行管理。
下表是一些常用的命令:
常用的命令 | 说明 |
---|---|
status | 查看当前管理的子进程 |
reload | 当配置发生改变时,进行热部署 |
restart [program_name] | 重启某个子进程 |
start [program_name] | 启动某个子进程 |
5、可以通过web页面进行进程可视化进程管理
使用浏览器访问127.0.0.1:9001,进入管理可视化界面
来源:https://blog.csdn.net/weixin_42390791/article/details/88866237
猜你喜欢
- 面临的问题在我设计一个分析系统中,我们公司的目标是能够处理来自数百万个端点的大量POST请求。web 网络处理程序将收到一个JSON文档,其
- 工作中遇到一个问题,两个字符串匹配,要求:每个字符串中最多含有一个*,?可以无限多个*代表一个任意长度的字符串,而?则代表一个字符要求可以提
- 如果机房马上要关门了,或者你急着要和MM约会,请直接跳到第四个自然段。以下叙述的脚本包括服务器端脚本和客户端的脚本,服务器端脚本指在服务器上
- 假如你拥有一个庞大的网站,内容又多,那么来访者往往很难找到自己所需要的东东,这时候你就需要一个站内搜索来帮助来访者更快的找到索要的资料了!现
- 最近遇到SQL Server 2005 输入框不能输入中文,在网上查了N久,试验了十几次奏这个法子有用:“把你表中的自动编号列放到最后面”。
- MySQL插件式存储引擎是MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作,并能允许和强制执行面向特殊应用需求的特定特性
- 一.权限表mysql数据库中的3个权限表:user 、db、 host权限表的存取过程是:1)先从user表中的host、 user、 pa
- 一、简介是一个 python 内置包,不需要额外安装即可使用urllib 是 Python 标准库中用于网络请求的库,内置四个模块,分别是u
- 在oracle数据库的开发中,常因为时间的问题大费周章,所以特地将ORACLE数据的日期函数收藏致此。乃供他日所查也。 add_months
- 惊现!表面下的隐藏信息——浅谈信息可视化1910年,病卧床上的魏格那(德国气象学家,以“大陆漂移学说”闻名),无意地注视着墙上的世界地图……
- 重读LukeW的《Web Form Design:Filling in the Blanks》感触很深,除佩服LukeW的钻研精神外,更多的
- 在Internet上我们每天都会遇到数不清的表单,也看到其中大部分并没有限制用户多次提交同一个表单。缺乏这种限制有时候会产生某些预料不到的结
- 不知道做网络程序的朋友是否重视COOKIES作用域对于多域名或 主域与WWW二级域名同时共用一站点,设置Cookies的作用域,让整个网站用
- 运行代码框<html><META HTTP-EQUIV="Content-Type" content=
- 之前在比赛的时候需要用Python实现灰色关联分析,从网上搜了下只有实现两个列之间的,于是我把它改写成了直接想Pandas中的计算工具直接计
- 1 文件'''文件存储文件主名.扩展名'''Python中常有的数据文件类型有文本文件、二进
- 因为要做移动梦网WAP的一些接口,所以要用到这种方式,接下来会有ASP.net版本的,这个是ASP版本的,利用了MSXML2.XMLHTTP
- 本文实例讲述了Yii2框架实现登陆添加验证码功能。分享给大家供大家参考,具体如下:models中LoginForm.phppublic $v
- 简单说明:思路:从数据岛menuXML中读取数据,从树的根节点开始分析树,利用 hasChildNodes() [方法:是否含有子节点 ]
- MySQL GUI Tools是一套图形化桌面应用工具套装,可以用来管理MySQL服务器。该套装工具包含三个工具:MySQL Query B