zoukankan      html  css  js  c++  java
  • Python—守护进程管理工具(Supervisor)

    一、前言简介

    1、Supervisor 是一个 Python 开发的 client/server 系统,可以管理和监控类 UNIX 操作系统上面的进程。可以很方便的用来启动、重启、关闭进程(不仅仅是 Python 进程)。

    2、Supervisor 安装完成之后,可以编写配置文件,来满足自己的需求。为了方便,我们把配置分成两部分:supervisord(这是 server 端,对应的有 client 端:supervisorctl)和应用程序(即我们要管理的程序)。

    • supervisord(server 部分):主要负责管理子进程,响应客户端命令以及日志的输出等,受控的监听进程都会以其子进程地方式出现,不过如果supervisord的主进程非正常退出时,被管理的进程仍然是运行状态。
    • supervisorctl(client 部分):命令行客户端,用户可以通过它与不同的 supervisord 进程联系,获取子进程的状态等。

    3、Supervisord 要求管理的程序是非daemon程序,supervisord 会帮你把它转成daemon程序,因此如果用supervisord来管理nginx的话,必须在nginx的配置文件里添加一行设置daemon off让nginx以非daemon方式启动,当然了,redis等亦如是。 

    二、安装supervisor

    1、安装supervisor

    [root@localhost ~]# pip install supervisor
    

    2、测试supervisor安装是否成功

    [root@localhost ~]# echo_supervisord_conf
    

    3、卸载supervisor

    [root@localhost ~]# pip uninstall supervisor
    

    supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf。分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。

    三、配置supervisord

    安装 supervisor 完成之后,可以编写配置文件,来满足自己的需求。为了方便,我们把配置分成两部分:supervisord(这是 server 端,对应的 client 端:supervisorctl)和应用程序(即我们要管理的程序)。首先来看 supervisord 的配置文件。

    1、通过运行 echo_supervisord_conf 命令生成 supervisor 的初始化配置文件:supervisord.conf(supervisord.conf文件的位置无所谓,这里当作第二个位置)

    [root@localhost ~]# echo_supervisord_conf > /etc/supervisord.conf
    [root@localhost ~]# echo_supervisord_conf > /etc/supervisor/supervisord.conf
    

    2、启动 supervisord 服务(通过 -c 选项指定配置文件路径,如果不指定会按照这个顺序查找配置文件:$CWD/supervisord.conf,  $CWD/etc/supervisord.conf,  /etc/supervisord.conf,  /etc/supervisor/supervisord.conf):

    [root@localhost ~]# supervisord                                          # 默认去找 /etc/supervisord.conf 这个配置文件       
    [root@localhost ~]# supervisord -c /etc/supervisord.conf                 # 到指定路径下去找配置文件         
    [root@localhost ~]# supervisord -c /etc/supervisor/supervisord.conf      # 到指定路径下去找配置文件

    3、查看 supervisord 服务是否在运行:

    [root@localhost ~]# ps aux | grep supervisord
    

    4、查看 supervisord 服务是否生效

    [root@localhost ~]# ps -ef | grep ProjectName

    四、配置文件参数说明

    [unix_http_server]
    file=/tmp/supervisor.sock   ;UNIX socket 文件,supervisorctl 会使用
    ;chmod=0700                 ;socket文件的mode,默认是0700
    ;chown=nobody:nogroup       ;socket文件的owner,格式:uid:gid
    
    ;[inet_http_server]         ;HTTP服务器,提供web管理界面
    ;port=127.0.0.1:9001        ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
    ;username=user              ;登录管理后台的用户名
    ;password=123               ;登录管理后台的密码
    
    [supervisord]
    logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
    logfile_maxbytes=50MB        ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
    logfile_backups=10           ;日志文件保留备份数量默认10,设为0表示不备份
    loglevel=info                ;日志级别,默认info,其它: debug,warn,trace
    pidfile=/tmp/supervisord.pid ;pid 文件
    nodaemon=false               ;是否在前台启动,默认是false,即以 daemon 的方式启动
    minfds=1024                  ;可以打开的文件描述符的最小值,默认 1024
    minprocs=200                 ;可以打开的进程数的最小值,默认 200
    
    [supervisorctl]
    serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
    ;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
    
    ; [program:xx]是被管理的进程配置参数,xx是进程的名称
    [program:xx]
    command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run  ; 程序启动命令
    autostart=true       ; 在supervisord启动的时候也自动启动
    startsecs=10         ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
    autorestart=true     ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
    startretries=3       ; 启动失败自动重试次数,默认是3
    user=tomcat          ; 用哪个用户启动进程,默认是root
    priority=999         ; 进程启动优先级,默认999,值小的优先启动
    redirect_stderr=true ; 把stderr重定向到stdout,默认false
    stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认50MB
    stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是10
    ; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
    stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
    stopasgroup=false     ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
    killasgroup=false     ;默认为false,向进程组发送kill信号,包括子进程
    
    ;包含其它配置文件
    [include]
    files = /www/server/panel/plugin/supervisor/profile/*.ini    ;可以指定一个或多个以.ini结束的配置文件

    五、配置supervisord开机自启

    1.在 /usr/lib/systemd/system/ 目录下面新建文件supervisord.service,并写入如下内容:

    [Unit]
    Description=Process Monitoring and Control Daemon(Supervisor daemon)
    After=rc-local.service nss-user-lookup.target
    
    [Service]
    Type=forking
    ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
    ExecStop=/usr/bin/supervisord shutdown
    ExecReload=/usr/bin/supervisord reload
    killMode=process
    Restart=on-failure
    RestartSec=42s
    
    [Install]
    WantedBy=multi-user.target

    2.启动服务:执行开机启动命令,让 supervisord 服务开机自启。

    [root@localhost ~]# systemctl enable supervisord

    3.验证一下是否为开机启动。enabled:开机自启。disabled:开机不自启。

    [root@localhost ~]# systemctl is-enabled supervisord

    4.重启服务器,检查 supervisor 是否启动。

    [root@localhost ~]# ps aux | grep supervisor
    

    六、Web管理页面

    supervisor提供了可视化的Web管理页面,允许远程操作,但是需要在配置文件中手动打开。可以在网页端访问supervisor服务。

    注意:如果是腾讯云或阿里云服务器,需要安全组放行9001端口,才能访问。

    # 1.打开配置配件
    [root@localhost ~]# vi /etc/supervisor/supervisord.conf
     
    # 2.将下面几行前面的分号去掉,修改一下数据保存退出(用户名与密码自己定义)
    [inet_http_server]             # inet (TCP) server disabled by default
    port=0.0.0.0:9001              # ip_address:port specifier, *:port for all iface
    username=user                  # default is no username (open server)
    password=123                   # default is no password (open server)
    
    # 3.重新载入配置文件
    [root@localhost ~]# supervisorctl reload
     
    # 4.在浏览器输入:IP:9001,再输入用户名与密码即可登陆查看。

    七、开启多个进程

    numprocs=2         # 启动进程的数目,默认为1。; 若 numprocs 不为1时,就是进程池的概念。process_name 的表达式中一定要包含 process_num 来区分不同的进程。
    process_name=%(program_name)s_%(process_num)02d      # 直接就可以使用

    八、Supervisor管理的项目名称是中文的问题解决

    在配置文件中添加或修改:environment=LANG="en_US.UTF-8",LC_ALL="en_US.UTF-8"。例如:

    environment=LANG="en_US.UTF-8",LC_ALL="en_US.UTF-8"
    
    [include]
    files = /www/server/panel/plugin/supervisor/profile/*.ini
    

     https://www.osgeo.cn/post/71f93

    九、常见报错问题

    1、Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord。

    [root@localhost ~]# ps -ef | grep supervisord      # 获取所有supervisord正在运行的pid。假设pid值为2506 
    [root@localhost ~]# kill -s SIGTERM 2506           # 杀死进程,之后再重新执行:supervisord -c /etc/supervisor/supervisord.conf 即可。
    

    2、pip下载报错

    [root@localhost ~]# /www/server/panel/pyenv/bin/pip install supervisor -i http://pypi.douban.com/simple --trusted-host pypi.douban.com --ignore-installed meld3
    

      

  • 相关阅读:
    【刷题】Linux修改权限命令
    【刷题】Linux进程通信方式
    【刷题】网络:TCP与UDP
    【刷题】SQL基本操作
    【刷题】数据库三大范式
    【刷题】java会不会内存泄漏
    【刷题】Java-重写和重载
    【刷题】Java面向对象概述
    【刷题】Java垃圾回收常见问题
    测试常见问题合集
  • 原文地址:https://www.cnblogs.com/liuhaidon/p/12217153.html
Copyright © 2011-2022 走看看