supervisord的官网:http://supervisord.org

supervisor管理进程,是通过fork/exec的方式将这些被管理的进程当作supervisor的子进程来启动,所以我们只需要将要管理进程的可执行文件的路径添加到supervisor的配置文件中就好了。此时被管理进程被视为supervisor的子进程,若该子进程异常中断,则父进程可以准确的获取子进程异常中断的信息,通过在配置文件中设置autostart=ture,可以实现对异常中断的子进程的自动重启。

Docker使用supervisor:可以用于Docker容器里的进程管理,将配置好的supervisord.conf文件copy进docker的项目目录,Dockerfile文件里添加:RUN pip install supervisor 在Docker run语句中添加:

sh -c 'supervisord -c /app/sumeru-web/supervisord.conf(supervisord配置文件路径) && bash'

平台要求:

Supervisor可以运行在大多数Unix系统上,但不支持在Windows系统上运行

Supervisor需要Python2.4及以上版本,但任何Python 3版本都不支持

安装supervisor:使用python2 安装:pip install supervisor

如果报错vim /usr/lib/python2.6/site-packages/supervisor-3.3.3-py2.6.egg-info/requires.txt

注销如下内容即可:#meld3 >= 0.6.5

Ubuntu:sudo apt-get install supervisor   

CentOS 6.4:

1. 安装easy_install:sudo yum install python-setuptools-devel

2. 安装Supervisor:easy_install supervisor

生成配置文件:echo_supervisord_conf > /etc/supervisord.conf(文件目录自己定)

然后启动命令(可以用在docker run中):supervisord -c /etc/supervisord/supervisor.conf

关闭命令: supervisorctl shutdown

修改配置文件

[program:sumeru-web]
directory=/app/sumeru-web
command=python3.7 run.py --port=79%(process_num)02d --config=settings.py 管理命令,supervisor不支持后太进程
process_name=%(program_name)s-79%(process_num)02d
umask=022                                                           进程启动用户
autostart=true                                                        是否随supervisor启动
autorestart=true                                                     是否在挂了之后重启,意外关闭后会重启,比如kill掉
startsecs=1
startretries=3                                                          启动尝试次数
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=1
stopasgroup=true
killasgroup=true
redirect_stderr=true
stdout_logfile=/app/sumeru-web/web.log                标准输出的位置
numprocs=4
numprocs_start=0

loglevel=info                                                             ;日志的级别

 

有几个配置项值得解释一下,可以根据需要自行设置。

1. stopasgroup=true。这一配置项的作用是:如果supervisord管理的进程px又产生了若干子进程,使用supervisorctl 停止px进程,停止信号会传播给px产生的所有子进程,确保子进程也一起停止。这一配置项对希望停止所有进程的需求是非常有用的。

2. autostart=true。这一配置项的作用是:当启动supervisord的时候会将该配置项设置为true的所有进程自动启动。

启动supervisord

确保配置无误后可以在每台主机上使用下面的命令启动supervisor的服务器端supervisord:supervisord

 停止supervisord :supervisorctl shutdown

重新加载配置文件:supervisorctl reload
进程管理

1. 启动supervisord管理的所有进程

supervisorctl start all

2. 停止supervisord管理的所有进程

supervisorctl stop all

3. 启动supervisord管理的某一个特定进程

supervisorctl start program-name // program-name为[program:xx]中的xx

4.  停止supervisord管理的某一个特定进程 

supervisorctl stop program-name // program-name为[program:xx]中的xx

5.  重启所有进程或所有进程

supervisorctl restart all // 重启所有

supervisorctl reatart program-name // 重启某一进程program-name为[program:xx]中的xx

6. 查看supervisord当前管理的所有进程的状态:supervisorctl status

【遇到问题及解决方案】

在使用命令supervisorctl start all启动控制进程时,遇到如下错误:unix:///tmp/supervisor.sock no such file

出现上述错误的原因是supervisord并未启动,只要在命令行中使用命令sudo supervisord启动supervisord即可。

安装supervisord-monitor
supervisord-monitor是对supervisord的一个集中化管理工具,可以对supervisor统一化操作
1.安装下载:git clone https://github.com/mlazarov/supervisord-monitor.git
生成配置文件
cd supervisord-monitor/
cp application/config/supervisor.php.example application/config/supervisor.php
2.修改配置文件,添加supervisord主机 mweb08 展示名 url 服务器地址 port 端口

$config['supervisor_servers'] = array(
        'mweb08' => array(
                'url' => 'http://mweb08/RPC2',
                'port' => '9001',
                'username' => 'admin',
                'password' => '123456'
        ),
        'mweb07' => array(
                'url' => 'http://mweb07/RPC2',
                'port' => '9001',
                'username' => 'admin',
                'password' => '123456'
        ),
);

3.添加nginx对supervisord-monitor的支持

server {
       listen 82;
       server_name  localhost;
       set $web_root /data/web/supervisord-monitor/public_html;
       root $web_root;
       index  index.php index.html index.htm;
 
       location / {
            try_files $uri $uri/ /index.php;
       }
 
       location ~ \.php$ {
           fastcgi_pass   127.0.0.1:9000;
           fastcgi_index  index.php;
           include        fastcgi_params;
           fastcgi_param  SCRIPT_FILENAME $web_root$fastcgi_script_name;
           fastcgi_param  SCHEME $scheme;
        }

以上配置文件用到几个部分:

[unix_http_server]:这部分设置HTTP服务器监听的UNIX domain socket

file: 指向UNIX domain socket,即file=/var/run/supervisor.sock

chmod:启动时改变supervisor.sock的权限

[supervisord]:与supervisord有关的全局配置需要在这部分设置

logfile: 指向记录supervisord进程的log文件

pidfile:pidfile保存子进程的路径

childlogdir:子进程log目录设为AUTO的log目录

[supervisorctl]:

serverurl:进入supervisord的URL, 对于UNIX domain sockets, 应设为 unix:///absolute/path/to/file.sock

[include]:如果配置文件包含该部分,则该部分必须包含一个files键:

files:包含一个或多个文件,这里包含了/etc/supervisor/conf.d/目录下所有的.conf文件,可以在该目录下增加我们自己的配置文件,在该配置文件中增加[program:x]部分,用来运行我们自己的程序,如下:

[program:x]:配置文件必须包括至少一个program,x是program名称,必须写上,不能为空

command:包含一个命令,当这个program启动时执行

directory:执行子进程时supervisord暂时切换到该目录

user:账户名

startsecs:进程从STARING状态转换到RUNNING状态program所需要保持运行的时间(单位:秒)

redirect_stderr:如果是true,则进程的stderr输出被发送回其stdout文件描述符上的supervisord

stdout_logfile:将进程stdout输出到指定文件

stdout_logfile_maxbytes:stdout_logfile指定日志文件最大字节数,默认为50MB,可以加KB、MB或GB等单位

stdout_logfile_backups:要保存的stdout_logfile备份的数量

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐