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备份的数量