zoukankan      html  css  js  c++  java
  • 进程管理工具Supervisor(一)简介与使用

    Supervisor是用Python开发的一套client/server架构的进程管理程序,能做到开机启动,以daemon进程的方式运行程序,并可以监控进程状态等等。

    linux进程管理方式有传统的rc.d、新兴的upstart、systemd等,与这些相比,Supervisor有着自己的特点。

    便利性

    使用rc.d管理进程的时候,一是要写耗时耗力的脚本,二是管理的进程挂掉的话不会自动重启。

    而supervisor要启动子进程,只需要将子进程的启动命令写入配置文件即可,配置自动重启子进程也很方便。

    精确

    supervisor作为父进程监控子进程,得到的子进程状态是很准确的。

    授权

    一般要管理linux进程的话,特别是在一些“low" tcp端口,比如1024以下端口中运行的程序,都需要root权限。

    而以root权限启动supervisord后,一般的用户可以在一个简单的shell或者web界面中获取supervisord控制的子进程运行状态,并通过stop、start、restart的命令控制子进程的运行。

    进程组

    supervisor可以对子进程以start all或者restart all命令的方式进行统一管理。

    中央集中式管理

    supervisor可以在同一个地方启动、停止或者监视管理的进程。既可以单独的控制一个进程,也可以一起控制一组进程。

    管理的时候,既可以本地管理,又可以远程连接,提供命令行接口与web页面接口。

    高效性

    supervisor是通过fork/exec的方式启动子进程的,子进程挂掉的话,操作系统会立即通知supervisor。

    兼容性

    除了windows,其他操作系统平台都可运行supervisor。supervisor使用python编写,不需要c编译器。

    组件

     supervisord

    supervisor的服务器端,负责启动子程序,响应客户端发来的命令,重启子程序,记录子程序stdout和stderr的日志,处理Event。

    配置文件一般是名为/etc/supervisord.conf的ini文件。

     supervisorctl

    supervisor的命令行客户端,提供一个类shell接口,用户可以使用supervisorctl连接不同的supervisord进程,查看子进程状态,start、stop子进程,获取控制的子进程列表。

    客户端可以使用unix socket或者tcp socket与服务端进行通讯,通过配置文件中的[supervisorctl]段进行配置。

    Web Server

    使用tcp socket启动supervisord的时候,提供的一个访问supervisor的web接口。

    url地址通过配置文件中的[inet_http_server]进行设置。

    XML-RPC Interface

    一个XML-RPC接口

    下载

    可以使用setuptools或者pip下载:

    easy_install supervisor
    or
    pip install supervisor
    

    ubuntu中使用apt下载:

    apt-get install supervisor
    

    配置文件

    运行echo_supervisord_conf命令可以在shell中显示一份supervisor配置文件样本。配置一般是放在文件/etc/supervisord.conf的,所以可以将配置输入到配置文件中:

    echo_supervisord_conf > /etc/supervisord.conf
    

    上述命令需要root权限,如果没有权限或者想另置配置文件地址,可以在当前目录生成:

    echo_supervisord_conf > supervisord.conf
    

    然后启动时使用-c选项指定配置文件即可:

    supervisord -c supervisord.conf

    启动

    首先配置要启动的子进程,可以在supervisord.conf中配置,也可以单独配置,supervisord.conf中的include配置:

    [include]
    files = /etc/supervisor/conf.d/*.conf
    

    所以可以在/etc/supervisor/conf.d/目录下,以.conf作为扩展名为子进程建立单独的配置文件,比如建立一个foo.conf文件:

    [program:foo]
    command=/bin/cat
    

    上述是最简单的配置了,foo为子进程名称,command是子进程运行命令。

    重启supervisor使配置生效:

    service supervisor restart
    

    或者直接执行启动supervisord:

    $BINDIR/supervisord

    启动foo子进程:

     supervisorctl start foo
    

    一个实际例子,启动celery beat服务,建立celerybeat.conf文件:

    ; ================================
    ;  celery beat supervisor example
    ; ================================
    
    [program:celerybeat]
    ; Set full path to celery program if using virtualenv
    command=celery beat -A myapp --schedule /var/lib/celery/beat.db --loglevel=INFO
    
    ; remove the -A myapp argument if you aren't using an app instance
    
    directory=/path/to/project
    user=nobody
    numprocs=1
    stdout_logfile=/var/log/celery/beat.log
    stderr_logfile=/var/log/celery/beat.log
    autostart=true
    autorestart=true
    startsecs=10
    
    ; Causes supervisor to send the termination signal (SIGTERM) to the whole process group.
    stopasgroup=true
    
    ; if rabbitmq is supervised, set its priority higher
    ; so it starts first
    priority=999
    

    启动:

    $ supervisorctl start celerybeat
    celerybeat: started
    

    celery beat服务开始运行了:

    [2017-12-22 07:13:47,904: WARNING/ForkPoolWorker-1] 32
    [2017-12-22 07:13:47,908: INFO/ForkPoolWorker-1] Task tests.tasks.add[77706e41-83c1-4545-922b-b77a57205ef5] succeeded in 0.00359446300718s: None
    [2017-12-22 07:13:57,903: INFO/MainProcess] Received task: tests.tasks.add[3f9c7c88-61aa-44cc-a517-14f32305ad64]  
    [2017-12-22 07:13:57,907: WARNING/ForkPoolWorker-1] 32
    [2017-12-22 07:13:57,910: INFO/ForkPoolWorker-1] Task tests.tasks.add[3f9c7c88-61aa-44cc-a517-14f32305ad64] succeeded in 0.00268728499941s: None
    [2017-12-22 07:14:07,903: INFO/MainProcess] Received task: tests.tasks.add[90e4277b-7041-4c3a-905c-1a5e16272d31]  
    [2017-12-22 07:14:07,907: WARNING/ForkPoolWorker-1] 32
    [2017-12-22 07:14:07,910: INFO/ForkPoolWorker-1] Task tests.tasks.add[90e4277b-7041-4c3a-905c-1a5e16272d31] succeeded in 0.0029478570068s: None

    配置不正确的话,会报supervisor ERROR (spawn error)错误,可以使用tail命令看下错误日志:

    supervisorctl tail celerybeat stdout
    

    查看管理的子进程运行状态:

    $ supervisorctl status
    celerybeat                       RUNNING   pid 66802, uptime 0:12:59
    

    关闭子进程:

    supervisorctl stop celerybeat
    

    不加参数的直接运行supervisorctl命令,会进入supervisor客户端的交互终端进行操作。

    要通过web页面访问supervisor,可以添加以下配置:

    [inet_http_server]
    port = 127.0.0.1:9001
    username = username
    password = yourpwd
    

    浏览器访问127.0.0.1:9001,输入配置的用户名、密码,进入页面:

  • 相关阅读:
    cygwin mysql forget root password
    emacs 复制粘贴的正确姿势
    yarn
    mysql 和 postgresql 区别
    hdfs
    spark
    hbase
    kafka
    flume
    java jar
  • 原文地址:https://www.cnblogs.com/linxiyue/p/8086756.html
Copyright © 2011-2022 走看看