进程管理工具supervisor的使用

时间:2021-08-15 04:37:05

centos 6.5, python 2.6, supervisor 3.3.1;

Linux下后台运行程序通常的做法是用nohub,然后配以进程的检测来实现服务式的操作,但其实有更好的选择supervisor,尤其是在多个程序需要管理时;

安装

yum直接安装的版本比较低,推荐使用Python的包安装工具进行安装:

# pip install supervisor

如果没有pip这个命令就:

# yum install python-pip -y

验证安装:

# supervisord -version
  3.3.1

配置

生成主配置文件:

# echo_supervisord_conf > /etc/supervisord.conf

修改/etc/supervisord.conf末尾的include段:

# vi /etc/supervisord.conf
  [include]
  files = /etc/supervisord.d/*.ini

把自己的程序配置放到/etc/supervisord.d/里面:

# mkdir -p /etc/supervisord.d/
# vi /etc/supervisord.d/myapp.ini
    [program:myapp]
    command=/bin/sh /bin/myapp.sh  #程序启动命令
    autostart=false  #是否随supervisord启动
    autorestart=false  #退出后是否自动重启,可选unexpected表示异常退出时才自动重启
user=root  #启动用户

redirect_stderr=false  #是否把stderr重定向到stdout
stdout_logfile=/var/log/myapp.stdout  #stdout重定向到文件 stderr_logfile=/var/log/myapp.stderr  #stderr重定向到文件

这里只写了常用的配置,更多可参考/etc/supervisord.conf中的例子;

下面是程序myapp.sh的内容:

# cat /bin/myapp.sh
  #!/bin/sh
  n=1
  while true
  do
      echo myapp $n
      let n++
      sleep 1
  done

使用

启动服务(可能会有警告说用了root用户,配置文件不是指定的而是搜索到的,没有影响):

# supervisord

使用命令supervisorctl可以进入supervisor的客户端shell,支持自动补全,输入help查看都有那些命令可用:

进程管理工具supervisor的使用

也可以用supervisorctl+cmd不进入shell进行操作:

进程管理工具supervisor的使用

下面介绍常用的命令:

reload            重启supervisord服务

shutdow          停止supervisord服务

maintail [-30/-f]       类似tail命令的方式查看服务进程的控制台输出

status            列出所管理程序的状态

start/stop/restart myapp  启动/停止/重启指定程序

pid             服务进程ID

pid myapp            指定程序的进程ID

tail [-30/-f] myapp       类似tail命令的方式查看指定程序的控制台输出

tips: 如果是Python程序,会发现用print打印的内容supervisorctl tail看不到,原因是缓存,把配置中的command改为python -u myapp.py即可;

分组

程序较多时可以用supervisorctl start all来统一操作,但如果程序较多但又不能统一操作呢?答案是分组,可以统一操作的分到一个组;

分组是在配置了program的基础上进行的,根据上节的内容,假设配置了两个program:

[program:myapp1]

[program:myapp2]

来把这两个配置为一个组app:

# vi /etc/supervisord.d/app.ini
    [group:app]
    programs=myapp1,myapp2

在supervisor的shell中操作分组:

进程管理工具supervisor的使用

tips:分组后,单个操作时需要带上组名:supervisorctl tail app:myapp1;

over