Supervisord

Supervisord是一款基于Python的进程管理工具,当主机上存在多个的进程需要管理时,通过supervisor可以简化进程的管理。 再通过supervisor提供的rpc接口,可以实现多机多进程管理。

管理进程配置

supervisord进程管理_接口supervisord进程管理_管理工具_02


配置示例:

[program:storm-nimbus]
command=/opt/cluster/storm/bin/storm nimbus
user=
autostart=true
autorestart=true
startsecs=15
startretries=999
log_stdout=true
log_stderr=true
logfile=/data/cluster/logs/storm/nimbus.out
logfile_maxbytes=20MB
logfile_backups=10


多机多进程管理

Github上的supervisord-monitor项目为多机多进程管理提供了 很好的思路。

supervisord进程管理_command_03


******************************************************************************************

1.安装(以下方式任选一种)

- easy_install supervisor- pip install supervisor- yum install supervisor- apt-get install supervisor- 下载源码包使用: python setup.py install 来安装

2.配置

  • 生成基础配置文件

    echo_supervisord_conf > /usr/local/supervisor/supervisord.conf
  • 配置supervisor

    • 更改include区段

      [include]
      files = /usr/local/supervisor/conf/*.conf # 启动进程配置文件所在位置

    • 如果需要web控制界面

      [inet_http_server]
      port=0.0.0.0:9001
      username=username ; 你的用户名
      password=password ; 你的密码

  • 启动进程配置说明

     ; 管理单个进程的配置,可创建多个,下面是所有可能的配置选项;[program:theprogramname];command=/bin/cat              ; 启动进程的命令 使用相对路径,可以加参数;process_name=%(program_name)s ; 进程名称 表达式 (默认 %(program_name)s);numprocs=1                    ; 进程数目 (def 1);directory=/tmp                ; 执行命令所在的目录 (def no cwd);umask=022                     ; 进程默认权限 (default None);priority=999                  ; 进程启动相对优先权 (default 999);autostart=true                ; 跟随supervisor启动时启动 (default: true);autorestart=unexpected        ; 计划启动 (default: unexpected);startsecs=1                   ; 延时启动 (def. 1);startretries=3                ; 最多连续启动失败 (default 3);exitcodes=0,2                 ; 进程结束代码 (default 0,2);stopsignal=QUIT               ; signal used to kill process (default TERM);stopwaitsecs=10               ; 最长结束等待时间,否则使用 SIGKILL (default 10);stopasgroup=false             ; 是否想UNIX进程组发送结束信号 (default false);killasgroup=false             ; SIGKILL UNIX 进程组 (def false);user=chrism                   ; 设置启动此程序的用户;redirect_stderr=true          ; 重定向程序的标准错误到标准输出 (default false);stdout_logfile=/a/path        ; 标准输出的日志路径, NONE for none; default AUTO;stdout_logfile_maxbytes=1MB   ; 日志文件最大值,否则循环写入 (default 50MB);stdout_logfile_backups=10     ; 标准输出日志备份数目 (default 10);stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0);stdout_events_enabled=false   ; emit events on stdout writes (default false);stderr_logfile=/a/path        ; 标准错误输出日志路径, NONE for none; default AUTO;stderr_logfile_maxbytes=1MB   ; 日志文件最大值,否则循环写入 (default 50MB);stderr_logfile_backups=10     ; 标准错误日志备份数目 (default 10);stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0);stderr_events_enabled=false   ; emit events on stderr writes (default false);environment=A="1",B="2"       ; 进程附加环境 (def no adds);serverurl=AUTO                ; override serverurl computation (childutils)

3.进程管理

Supervisord安装完成后有两个可用的命令行supervisord和supervisorctl,命令使用如下:

supervisord: 启动Supervisord, 一般在etc/init.d/下面会有对应的服务命令, 用它启动即可
  • 指定配置文件启动:

    supervisord -c /usr/local/supervisor/supervisor.conf

supervisorctl 管理终端:

  • 直接运行supervisorctl打开supervisor控制终端, 输入help可以查看支持的命令,基本命令如下:

    default commands (type help <topic>):=====================================add    clear  fg        open  quit    remove  restart   start   stop  update
    avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version
  • 或者可以在bash直接执行supervisor控制命令, 基本命令如下:

    supervisorctl status: 查看当前运行的进程列表supervisorctl stop xxx: 停止某一个进程(xxx),xxx为[program:theprogramname]里配置的值。supervisorctl start xxx: 启动某个进程supervisorctl restart xxx: 重启某个进程supervisorctl stop groupworker: 重启所有属于名为groupworker这个分组的进程(start,restart同理)supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

4.其他说明

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

  • 同理, 使用supervisor管理redis的启动时, 也必须设置: daemonize no

5.配置范例

    [program:test-demo]
    command=python /data/python/test/test.py
    autostart=true
    autorestart=true
    startsecs=10
    user=hello
    redirect_stderr=true
    stdout_logfile=/data/log/test.log
    stdout_logfile_maxbytes=10MB
    stdout_logfile_backups=10
    stopasgroup=true
    killasgroup=true
    environment=PYTHONPATH='/data/python/test'

6.问题备注

  • 一个可能的问题:

    * Starting Supervisor daemon manager......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.For help, use /usr/bin/supervisord -h......fail!
    • 解决:

      解决办法:unlink supervisor.sock文件的位置

6.参考资料

  • http://supervisord.org/

  • http://jwch.sdut.edu.cn/book/server/supervisor.html

  • http://blog.jiunile.com/linux%E8%BF%9B%E7%A8%8B%E7%AE%A1%E7%90%86supervisord.html