zoukankan      html  css  js  c++  java
  • Linux进程管理工具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页面:

    遇到的错误

    • 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

    监控工具

    参考

  • 相关阅读:
    生成客户端信任的证书文件
    postgresql Streaming Replication监控与注意事项
    采用pacemaker+corosync实现postgresql双机热备、高可用方案
    51nod1305(简单逻辑)
    51nod1091(贪心)
    51nod1009(1的数目)
    51nod1102(数塔)
    51nod1459(带权值的dijkstra)
    51nod1265(判断四个点是否共面)
    51node1264(判断线段相交)
  • 原文地址:https://www.cnblogs.com/tinywan/p/10205865.html
Copyright © 2011-2022 走看看