1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
      <output id="hzk7v"></output>
    2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
    3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

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

       更新时间£º2019年04月24日 10:50:46   作者£º陈家大耳   我要评论

      这篇文章主要介绍了Python supervisor强大的进程管理工具的使用£¬本文主要跟大家分享在类unix操作系统下supervisor的使用以及一些关于进程的知识£¬具有一定的参考价值£¬感兴趣的小伙伴?#24378;?#20197;参?#23478;?#19979;

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

      一¡¢问题背景

      1¡¢背景

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

      2¡¢后台(守护)¡¢前台进程

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

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

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

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

      下面是用Python bottle写的一个最简单的web应用(bottle-轻?#32771;?#26694;架£¬感兴趣的朋友可以去了解£¬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/£¬浏览器?#32479;?#29616;"hello world"£¬这时£¬ctrl+c后在访问就会报错了¡£下面演示如何将该进程启动为后台进程

      £¨1£©依然可以在终端输出的后台进程£¬就在命令行后加上&符号£¬依然可访问

      $ python server.py &



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

      ​  

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

      $ nohup python server.py &

      4¡¢如何辨别后台进程

      上面乱搞一通就变成了后台进程£¿别?#20445;?#25105;们通过ps命令看一下

      $ ps aux


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

      5¡¢存在的问题

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

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

      (2)在进程运行的过程中£¬因为某种原因£¬挂掉了£¬如何做?#35762;?#29992;人为干预自动重启进程呢£¿

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

      二¡¢什?#35789;Çsupervisor

      1¡¢定义

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

      注意£¬是一个管理工具£¬并不?#24378;?#25110;包¡£

      2¡¢作用

      Supervisor进程管理工具可以高效简单地对单个或者多个进程进行统一管理£¬如启动¡¢重启¡¢停止进程¡£更重要的作用是能在进程因为某种原因?#35272;?#26102;£¬做到自动重启

      3¡¢Supervisor的组成

      Supervisor主要由以下?#35762;?#20998;组成£º

      (1)supervisord:

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

      (2)supervisorctl:

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

      如何简单地理解£¿

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

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


      子进程配置文件的示例

      ​  

      常用配置参数?#24471;ö?/p>

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

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

      三¡¢如何使用supervisor

      1¡¢安装Supervisor

      两种方式进行安装

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

      注意£ºsupervisor只运行在python2.4以上的版本£¬但是不支持Python3.X£¬如果你的机?#29992;?#26377;相应的版本就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


      ​ 

      上图的红框的内容£¬其实就是主配置文件中的第六个框的配置项£¬只?#21069;?#23427;抽出来£¬形成独立的配置文件£¬达到分而治之的目的¡£

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

      3¡¢启动supercisord

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


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

      4¡¢使用supervisorctl进行进程管理

      进入supervisorctl交互界面£¬也要以带有配置文件的方式进入£¬这样才会跟踪?#33050;?#32622;

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

      ​  

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

      supervisor> help #查看命令


      于是乎£¬可以根据命令自由地对子进程进行管理¡£

      下表是一些常用的命令£º

      常用的命令 ?#24471;?/th>
      status 查看当前管理的子进程
      reload 当配置发生改变时£¬进行热部署
      restart [program_name] 重启某个子进程
      start [program_name] 启动某个子进程

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

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

      以上就是本文的全部内容£¬希望对大家的学习有所帮助£¬也希望大家多多支持脚本之家¡£

      相关文章

      • 将Django使用的数据库从MySQL迁移到PostgreSQL的教程

        将Django使用的数据库从MySQL迁移到PostgreSQL的教程

        这篇文章主要介绍了将Django使用的数据库从MySQL迁移到PostgreSQL的教程,同时提到了一些注意事项,需要的朋友可以参考下
        2015-04-04
      • PyQt5实现类似别踩白块游戏

        PyQt5实现类似别踩白块游戏

        这篇文章主要为大家详细介绍了PyQt5实现类似别踩白块游戏£¬具有一定的参考价值£¬感兴趣的小伙伴?#24378;?#20197;参?#23478;?#19979;
        2019-01-01
      • Python做简单的字符串匹配详解

        Python做简单的字符串匹配详解

        这篇文章主要介绍了Python做简单的字符串匹配详解的相关资料,需要的朋友可以参考下
        2017-03-03
      • python 判断网络连通的实现方法

        python 判断网络连通的实现方法

        下面小编就为大家分享一篇python 判断网络连通的实现方法£¬具有很好的参考价值£¬希望对大家有所帮助¡£一起跟随小编过来看看吧
        2018-04-04
      • Django ?#31243;父?#25454;配置生成SQL语句的问题

        Django ?#31243;父?#25454;配置生成SQL语句的问题

        今天小编就为大家分享一篇Django ?#31243;父?#25454;配置生成SQL语句的问题£¬具有很好的参考价值£¬希望对大家有所帮助¡£一起跟随小编过来看看吧
        2018-05-05
      • Python调用命令行进度条的方法

        Python调用命令行进度条的方法

        这篇文章主要介绍了Python调用命令行进度条的方法,涉及Python进度条的调用?#35760;?具有一定参考借鉴价值,需要的朋友可以参考下
        2015-05-05
      • Opencv+Python 色彩通道拆分及合并的示例

        Opencv+Python 色彩通道拆分及合并的示例

        今天小编就为大家分享一篇Opencv+Python 色彩通道拆分及合并的示例£¬具有很好的参考价值£¬希望对大家有所帮助¡£一起跟随小编过来看看吧
        2018-12-12
      • python学习之编写查询ip程序

        python学习之编写查询ip程序

        这篇文章主要介绍了python学习之编写查询ip程序 ,需要的朋友可以参考下
        2016-02-02
      • Python基于jieba库进行简单分词及词云功能实现方法

        Python基于jieba库进行简单分词及词云功能实现方法

        这篇文章主要介绍了Python基于jieba库进行简单分词及词云功能实现方法,结合?#36947;?#24418;式分析了Python分词库jieba以及wordcloud库进行词云绘制相关步骤与操作?#35760;?需要的朋友可以参考下
        2018-06-06
      • 跟老齐学Python之变量和参数

        跟老齐学Python之变量和参数

        对于变量和参数£¬不管是已经?#20040;?#30721;多年的老鸟£¬还是刚刚接触编程的小白£¬都会有时候清楚£¬有时候又有点模糊¡£因为£¬在?#23548;?#24212;用中£¬它们之间分分离离£¬比如£¬?#20040;?#30721;都知道£¬x=3中x是变量£¬它不是参数£¬但是在函数y=3x+4中£¬x是变量£¬也是参数¡£
        2014-10-10

      最新评论

      3dÊÔ»úºÅÖвÊÍø

        1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
          <output id="hzk7v"></output>
        2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
        3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>

            1. <output id="hzk7v"><pre id="hzk7v"><address id="hzk7v"></address></pre></output>
              <output id="hzk7v"></output>
            2. <nav id="hzk7v"><i id="hzk7v"><em id="hzk7v"></em></i></nav>
            3. <listing id="hzk7v"><delect id="hzk7v"><em id="hzk7v"></em></delect></listing>