进程管理工具之supervisor[详解]

摘要:
主管完美地解决了上述两个问题。当然,它可能具有更强大的功能。管理程序进程负责统一管理这些子进程的启动、重新启动和停止。您可以将supervisord理解为服务器,将supervisorctl理解为客户端,您输入的一些命令可以看作是客户端和服务器之间的交互过程。不要看管理程序。ini配置文件

原文链接:https://blog.csdn.net/weixin_42390791/article/details/88866237

一、问题背景
1、背景
​   如何才能让一个进程摆脱终端,获得相对较长的生命周期?

2、后台(守护)、前台进程
  ​什么是守护进程?通俗点讲就是后台跑着的进程,不会因为你关了终端服务就会随之停止,直到你把计算机的电源关闭。当进程变为后台进程后,同一个终端就会释放了,你可以在其中干别的事情,而不会干扰到你跑的服务。后台进程一般来说不能捕捉输入,服务的输出依然可以选择在终端输出。
​  同样的道理,理解前台进程就简单多了,前台进程就是你的一个服务在跑,但是不能再在同一个终端干别的事情,必须把你现有的服务给停掉之后才可以继续干别的事,前台进程可以捕捉输入、输出。

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

进程管理工具之supervisor[详解]第1张

​​  下面是用Python bottle写的一个最简单的web应用(bottle-轻量级框架,感兴趣的朋友可以去了解,pip install bottle可以安装)
​  进入终端

vim server.py
1
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 &
进程管理工具之supervisor[详解]第2张


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

$ nohup python server.py &进程管理工具之supervisor[详解]第3张

进程管理工具之supervisor[详解]第4张


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

$ ps aux
1

​  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一样,把配置文件按模块进行管理

进程管理工具之supervisor[详解]第5张

​   子进程配置文件的示例
​   常用配置参数说明:

进程管理工具之supervisor[详解]第6张

配置项 说明
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操作系统的发行版本,自行使用相应的软件管理命令)
1
$ pip install supervisor
1
​ 注意:supervisor只运行在python2.4以上的版本,但是不支持Python3.X,如果你的机子没有相应的版本就Google一下解决办法吧
​   安装完成之后,我的是默认的安装路径

$ cd /usr/local/etc/
进程管理工具之supervisor[详解]第7张

​   上图所示的supervisord.ini文件就是安装后产生的文件,supervisor.d是我自己自自建的文件夹,这个待会说。
​    linux操作系统的是安装路径

进程管理工具之supervisor[详解]第8张

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

2、编辑配置文件
$ cat -n supervisord.ini
1
​   可以看到大概有148行,有9个配置选项

 进程管理工具之supervisor[详解]第9张

进程管理工具之supervisor[详解]第10张

进程管理工具之supervisor[详解]第11张

进程管理工具之supervisor[详解]第12张

​   上图中画红色横线的地方要注意,有些人的supervisord.pid 以及 supervisor.sock 是放在 /tmp 目录下,这个目录是放临时文件的,容易丢失,强烈建议改目录放置,建议放在/var/run/下。
​   别看这supervisord.ini配置文件一大推东西,其实真正需要配的地方很少,本人就只是选用了第二个框的配置项,这里还提一下【include】配置项,跟NGNIX的配置文件如出一辙,意思是:我这里配置文件还包含了这个目录下的所有配置文件。还记得上本提到的supervisor.d目录吗?里面可以放置很多**.ini文件,而这些.ini**的文件其实很简单,仅仅包含了上图中的第六个配置项,这样就达到一个子进程一个配置文件,方便进行维护的目的。

$ ls supervisor.d/
进程管理工具之supervisor[详解]第13张


$ vim server2.py
进程管理工具之supervisor[详解]第14张

​  上图的红框的内容,其实就是主配置文件中的第六个框的配置项,只是把它抽出来,形成独立的配置文件,达到分而治之的目的。
  以上就配置好了两个子进程,接下来就是跑起来了

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

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

4、使用supervisorctl进行进程管理
​   进入supervisorctl交互界面,也要以带有配置文件的方式进入,这样才会跟踪到配置

$ supervisorctl -c /usr/local/etc/supervisord.ini
进程管理工具之supervisor[详解]第15张


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

supervisor> help #查看命令
进程管理工具之supervisor[详解]第16张

​  于是乎,可以根据命令自由地对子进程进行管理。
  下表是一些常用的命令:

常用的命令 说明
status 查看当前管理的子进程
reload 当配置发生改变时,进行热部署
restart [program_name] 重启某个子进程
start [program_name] 启动某个子进程
5、可以通过web页面进行进程可视化进程管理
​   使用浏览器访问127.0.0.1:9001,进入管理可视化界面

 进程管理工具之supervisor[详解]第17张

免责声明:文章转载自《进程管理工具之supervisor[详解]》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Hadoop 的版本问题java 获取当月第一天和最后一天 获取前一个月第一天和最后一天下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

系统基础信息模块psutil之系统进程管理方法篇

一、简介 获取当前系统的进程信息,可以让运维人员得知应用程序的运行状态,包括进程的启动时间、查看或设置CPU的亲和度,内存使用率、IO信息、socket连接、线程数等,这些信息可以呈现出指定进程是否存活,资源利用情况,为开发人员的代码优化、问题定位提供很好的数据参考。 (1)进程信息 psutil模块在获取进程信息方面也提供了很好的支持,包括使用psuti...

Linux基础--------监控系统、进程管理、软件包管理-------free、dd、kill、 rpm、yum、源码安装python

作业一:1) 开启Linux系统前添加一块大小为15G的SCSI硬盘 2) 开启系统,右击桌面,打开终端 3) 为新加的硬盘分区,一个主分区大小为5G,剩余空间给扩展分区,在扩展分区上划分1个逻辑分区,大小为5G fdisk -l /dev/sdb 查看新增加硬盘sdb的详细信息 第一个硬盘叫sda,新建的第二个就叫sdb,再增加一个就叫sdc,依此...

青蛙学Linux—进程管理

进程,Process,是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)、数据区域(data region)和堆栈(stac...

Linux进程管理

1.介绍 1.什么是进程 比如: 开发写的代码我们称为程序,那么将开发的代码运行起来。我们称为进程。总结一句话就是: 当我们运行一个程序,那么我们将运行的程序叫进程。PS1: 当程序运行为进程后,系统会为该进程分配内存,以及进程运行的身份和权限。PS2: 在进程运行的过程中,系统会有各种指标来表示当前运行的状态。 2.程序和进程的区别 1.程序是数据和指令...

进程管理02 通过PEB枚举进程所有模块

0x01  结构探究 先在win7 x86下通过windbg来探究通过peb来得到进程模块的步骤:  命令!process 0 0 exeplorer.exe 先获取到explorer.exe的EPROCESS的地址,如图我们可以看到EPROCESS的地址为:0x87782d40 ,PEB的地址为:0x7ffdf000  使用 .process /p /...

Linux 进程管理 ps、top、pstree命令

ps命令:查看系统中正在运行的进程 ps 是用来静态地查看系统中正在运行的进程的命令。不过这个命令有些特殊,它的部分选项不能加入"-",比如命令"ps aux",其中"aux"是选项,但是这个选项不能加入"-"。这是因为 ps 命令的部分选项需要遵守 BSD 操作系统的格式。所以,ps 命令的常用选项的组合是固定的。ps 命令格式如下: 查看系统中所有的进...