欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

Linux进程管理工具Supervisor

程序员文章站 2022-03-24 13:01:23
简述 Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。 它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理 ......

简述

supervisor是用python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。

也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。

安装

配置文件

  • 目录结构

    supervisor
    ├── conf.d
    │   └── echo_time.conf      -- 业务配置文件
    └── supervisord.conf        -- 主配置文件,一般不需要改动
  • 使用 apt-get 安装后,supervisor 的主配置文件在 /etc/supervisor/supervisord.conf
  • 子进程配置文件在 /etc/supervisor/conf.d/*.conf

supervisord 和 supervisorctl的关系

supervisord 是主进程

  • 常用命令

    # 使用默认的配置文件 /etc/supervisord.conf
    supervisord
    # 明确指定配置文件
    supervisord -c /etc/supervisord.conf
    # 使用 user 用户启动 supervisord
    supervisord -u user
  • 服务命令

    • 查看服务状态:sudo systemctl status supervisor.service
    • 开启服务:sudo systemctl start supervisor.service
    • 停止服务:sudo systemctl stop supervisor.service
    • 重启服务:sudo systemctl restart supervisor.service
    • 开机启动项:sudo systemctl enable supervisor.service
  • supervisor.service 文件

    [unit]
    description=supervisor process control system for unix
    documentation=http://supervisord.org
    after=network.target
    
    [service]
    execstart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
    execstop=/usr/bin/supervisorctl $options shutdown
    execreload=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf $options reload
    killmode=process
    restart=on-failure
    restartsec=50s
    
    [install]
    wantedby=multi-user.target

    supervisorctl 是客户端程序

    用于向supervisord服务发起命令。
  • 所有命令,通过 supervisorctl -h 可以查看帮助说明

    sudo supervisorctl  help
    
    default commands (type help <topic>):
    =====================================
    add    exit      open  reload  restart   start   tail   
    avail  fg        pid   remove  shutdown  status  update 
    clear  maintail  quit  reread  signal    stop    version
  • 控制子进程命令

    # 停止某一个进程,program_name 为 [program:x] 里的 x
    supervisorctl stop program_name
    # 启动某个进程
    supervisorctl start program_name
    # 重启某个进程
    supervisorctl restart program_name
    # 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
    supervisorctl stop groupworker:
    # 结束 groupworker:name1 这个进程 (start,restart 同理)
    supervisorctl stop groupworker:name1
    # 停止全部进程,注:start、restart、stop 都不会载入最新的配置文件
    supervisorctl stop all
    # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
    supervisorctl reload
    # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
    supervisorctl update
  • 修改进程配置文件后,只要 sudo systemctl restart supervisor.service则会自动加载哦

示例

  • 以简单的/home/www/python/echo_time.sh 为例

    #/bin/bash
    
    while true;
    do
        echo  `date +%y-%m-%d,%h:%m:%s`
        sleep 2
    done
  • /etc/supervisor/conf.d/新增子进程配置文件echo_time.conf

    ; /etc/supervisor/conf.d/echo_time.conf
    
    [program:echo_time]
    
    command     = /usr/bin/env sh /home/www/python/echo_time.sh
    directory   = /home/www/python
    user        = www
    startsecs   = 3
    
    redirect_stderr         = true
    stdout_logfile_maxbytes = 50mb
    stdout_logfile_backups  = 10
    stdout_logfile          = /home/www/python/log/echo_time.log
  • 然后启动程序:

    $ supervisorctl reread
    $ supervisorctl update

    这两个命令分别代表重新读取配置、更新子进程组

  • 这样刚才添加的 echo_time脚本就常驻运行起来了。可以通过日志查看运行情况:

    tail -f log/echo_time.log 
    2018-12-22,22:12:1545490695
    2018-12-22,22:12:1545490697
    2018-12-22,22:12:1545490699
    2018-12-22,22:12:1545490701
  • 也可以使用 sudo supervisorctl status查看子进程运行情况:

    sudo supervisorctl status
    echo_time                        running   pid 28906, uptime 0:08:36

web界面操作

  • 需要开启主配置文件 supervisord.conf注释掉的这4行 (/etc/supervisor/supervisord.conf)

    [inet_http_server]         ; inet (tcp) server disabled by default
    port=*:9001        ; (ip_address:port specifier, *:port for ;all iface)
    ;username=www              ; (default is no username (open server))
    ;password=www123456               ; (default is no password (open server))

    注意:如果修改配置文件时, [inet_http_server]这一行被注释,会导致不仅web需要认证,命令行使用 supervisorctl也需要认证,这时候就需要在交互式命令行里输入用户名、密码才能进行下一步的操作。

  • 浏览器访问:http://myip:9001 ,输入用户名、密码后,即可看到web页面:
    Linux进程管理工具Supervisor

遇到的错误

  • 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

监控工具

参考