supervisor管理

看似悲伤却不绝望

1. 介绍

  Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非root的user,这个user就可以管理它对应的进程。简而言之,Superviosr可以保证你的程序在服务器开机时自动启动以及程序意外终止时重新启动。

主要作用如下

  • 您的应用随着 Supervisor 的启动而启动.
  • 当您的程式出现问题挂掉时,他可以帮您重新启动.
  • 您可以通过他来查看您应用的状态.
  • 通过他来启动,停止,重启您的应用.
  • 设定自动重启的次数.

2. 环境搭建

  supervisor是基于python写的,所以我们用pip来安装。(我操作用户是root,如果你不是root身份,有的命令可能需要加上sudo提权)

root@leco:~# pip install supervisor
ubuntun
sudo apt-get install supervisor 

3. 配置文件

  生成supervisor配置文件,supervisor默认是没有配置文件的,所以如果不想从头“写”起,我们可以自己手动生成一份默认的配置文件。

root@leco:/etc/supervisor/conf.d# echo_supervisord_conf >/etc/supervisor/supervisord.conf

root@leco:/etc/supervisor/conf.d# tail -2 /etc/supervisor/supervisord.conf 
[include]
files = conf.d/*.conf

注:配置文件里面,前面加 ; 表示注释

supervisord是服务端,是个deamon,supervisorctl是客户。

在配置文件supervisord.conf最后修改

在文件结尾[include]节点处,把
;[include]
;files = relative/directory/*.ini

改为

[include]
files = conf.d/*.conf

启动

root@leco:/etc/supervisor/conf.d# ps axf|grep -v grep|grep supervisord
root@leco:/etc/supervisor/conf.d# ps axf|grep supervisord^C
root@leco:/etc/supervisor/conf.d# /usr/bin/python2 /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
Unlinking stale socket /tmp/supervisor.sock
root@leco:/etc/supervisor/conf.d# ps axf|grep -v grep|grep supervisord
32735 ?        Ss     0:00          \_ /usr/bin/python2 /usr/bin/supervisord -c /etc/supervisor/supervisord.conf

4. supervisord shell

root@leco:/etc/supervisor/conf.d# ls
long_sh.conf  nginx_super.conf
root@leco:/etc/supervisor/conf.d# cat long_sh.conf 
[program:long_sh]   ;程序名称,终端控制时需要的标识
#进程运行的用户身份 
user=root  
command=/opt/long.sh  ; 运行程序的命令
#错误日志保存路径 
stderr_logfile=/var/log/test.err.log   ; 错误日志文件
#输出日志保存路径 
stdout_logfile=/var/log/test.out.log   ; 输出日志文件
#开机自动启动 
autorestart=true  ; 程序意外退出是否自动重启
#自动重启 
autorestart=true 
root@leco:/etc/supervisor/conf.d# ll /opt/long.sh 
-rwxr-xr-x 1 root root 131 Nov 15 09:49 /opt/long.sh*
root@leco:/etc/supervisor/conf.d# cat /opt/long.sh 
#!/bin/bash
while true
do 
    # Echo current date to stdout
    echo `date`
    # Echo 'error!' to stderr
    echo 'error!' >&2
    sleep 1
done
supervisord.conf 配置文件解释
[unix_http_server]
file=/tmp/supervisor.sock   ;
;socket文件的路径,如果不设置的话,supervisorctl命令不能使用                
[inet_http_server]
port=127.0.0.1:9001            ;
; 这个是侦听的IP和端口,侦听所有IP用 :9001或*:9001。
[supervisord]     
;定义supervisord服务端进程的一些参数。这个不能出错,搞错一个,supervisor就不用干活了
logfile=/tmp/supervisord.log ;  
;supervisord主进程的日志路径,要和子进程日志区分开
logfile_maxbytes=100MB        ;
;当日志文件超过50M,会生成一个新的日志文件。0表示不限制文件大小
logfile_backups=5           ;
;日志文件保持的数量,supervisor在启动程序时,会自动创建10个buckup文件,用于log rotate,当设置为0时,表示不限制文件的数量。
loglevel=info                ; 
;日志级别,默认是 info,其他的还有 debug,warn,trace
pidfile=/home/work/super/supervisord.pid ;     
;supervisord的pid文件路径
nodaemon=false               ;    
;true表示supervisord进程将在前台运行。默认为false,以守护进程运行
minfds=1024                  ;  
;这个是最少系统空闲的文件描述符,低于这个值supervisor将不会启动。 系统的文件描述符在这里设置cat /proc/sys/fs/file-max,默认情况下为1024
minprocs=200                 ;
;最小可用的进程描述符,低于这个值supervisor也将不会正常启动。ulimit  -u可以查看linux下面用户的最大进程数,默认为200
[rpcinterface:supervisor]         
;这个选项是给XML_RPC用的
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]      
;这个主要是针对supervisorctl的一些配置
serverurl=unix:///home/work/super/supervisor.sock ;   
;这个是supervisorctl本地连接supervisord的时候,本地UNIX socket路径,是和前面的[unix_http_server]对应的, 默认值就是unix:///tmp/supervisor.sock
serverurl=http://0.0.0.0:9001 ;  
;supervisorctl远程连接supervisord的时候,用到的TCP socket路径,这个和前面的[inet_http_server]对应,默认就是http://127.0.0.1:9001
[include]
files = /home/work/super/*_super.conf   
;这个很重要,当我们要管理的进程很多的时候,写在一个文件里面  会显得很臃肿。所以可以把配置信息写到多个文件中,然后include调用。

重新加载配置
root@leco:/etc/supervisor/conf.d# supervisorctl reload
Restarted supervisord

root@leco:/etc/supervisor/conf.d# supervisorctl status | grep long
long_sh                          RUNNING   pid 11212, uptime 0:00:47

root@leco:/etc/supervisor/conf.d# supervisorctl status | grep long
long_sh                          RUNNING   pid 11212, uptime 0:00:47
root@leco:/etc/supervisor/conf.d# supervisorctl stop long_sh
long_sh: stopped
root@leco:/etc/supervisor/conf.d# supervisorctl status | grep long
long_sh                          STOPPED   Nov 15 10:56 AM
root@leco:/etc/supervisor/conf.d# supervisorctl start long_sh
long_sh: started
root@leco:/etc/supervisor/conf.d# supervisorctl status | grep long
long_sh                          RUNNING   pid 14638, uptime 0:00:03
常用命令
sudo service supervisor stop # 停止supervisor服务
sudo service supervisor start # 启动supervisor服务

supervisorctl restart <application name> ;重启指定应用
supervisorctl stop <application name> ;停止指定应用
supervisorctl start <application name> ;启动指定应用
supervisorctl restart all ;重启所有应用
supervisorctl stop all ;停止所有应用
supervisorctl start all ;启动所有应用

5. supervisord nginx

  由于supervisor不能监控后台程序,nginx 必须daemon off;也就是前台运行

root@leco:/etc/supervisor/conf.d# ls
long_sh.conf  nginx_super.conf
root@leco:/etc/supervisor/conf.d# cat nginx_super.conf 
[program:nginx]
command = /usr/sbin/nginx -g 'daemon off;'
startsecs=0
autostart=true
autorestart=true
stdout_logfile=/var/log/nginx_sup.log
stopasgroup=true
killasgroup=true

测试

root@leco:/etc/supervisor/conf.d# supervisorctl reload
Restarted supervisord
root@leco:/etc/supervisor/conf.d# supervisorctl stop nginx
nginx: stopped
root@leco:/etc/supervisor/conf.d# supervisorctl status
long_sh                          RUNNING   pid 3165, uptime 0:00:20
nginx                            STOPPED   Nov 15 11:12 AM
root@leco:/etc/supervisor/conf.d# supervisorctl start nginx
nginx: started
root@leco:/etc/supervisor/conf.d# supervisorctl stop nginx
nginx: stopped
root@leco:/etc/supervisor/conf.d# supervisorctl status
long_sh                          RUNNING   pid 3165, uptime 0:00:20
nginx                            STOPPED   Nov 15 11:12 AM
root@leco:/etc/supervisor/conf.d# supervisorctl start nginx
nginx: started

6. 常见错误

1、日志权限错误
IOError: [Errno 13] Permission denied: '/var/log/supervisor/supervisord.log'
原因,/var/log/supervisor/supervisord.log没有写权限,赋予权限即可:
sudo chmod -R 777 /var/log/supervisor/supervisord.log

2、开启HTTP Server错误
Error: Cannot open an HTTP server: socket.error reported errno.EACCES (13)
配置文件中 /var/run 文件夹,没有授予启动 supervisord 的相应用户的写权限。/var/run 文件夹实际上是链接到 /run,因此我们修改 /run 的权限
sudo chmod 777 /run

一般情况下,我们可以用 root 用户启动 supervisord 进程,然后在其所管理的进程中,再具体指定需要以那个用户启动这些进程。

3、日志权限问题
'INFO spawnerr: unknown error making dispatchers for 'app_name': EACCES'
修改日志文件的权限
sudo chmod 777 /usr/log/supervisor/supervisor.log
sudo chmod 777 /usr/log/supervisor/youAppName.log

4,指定运行太多问题,
Exited too quickly (process log may have details)
有可能是当前文件已经运行
kill 调当前的进程,再试试运行

5,找不到supervisor==3.81等版本
明明你已经安装了supervisor,但是还是报错
pkg_resources.DistributionNotFound: The 'supervisor==3.1.3' distribution was not found and is required by the application
有可能是因为你没有python2中没有下载supervisor
sudo easy_install supervisor
或者 pip2 install supervisor