Supervisor的作用与配置实例

supervisor简介

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

安装supervisor

pip安装supervisord

1
pip install supervisor

生成配置文件

1
echo_supervisord_conf > /etc/supervisord.conf

修改配置文件(分号;表示注释)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
[unix_http_server]
file=/tmp/supervisor.sock ; the path to the socket file
chmod=0700 ; sockef file mode (default 0700)

# 开启web界面
[inet_http_server] ; inet (TCP) server disabled by default
port=*:9001 ; ip_address:port specifier, *:port for all iface
username=admin ; default is no username (open server)
password=123456 ; default is no password (open server)

[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
minfds=1024 ; min. avail startup file descriptors; default 1024
minprocs=200 ; min. avail process descriptors;default 200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
[program:zookeeper]
command=/data/confluent/bin/zookeeper-server-start /data/confluent/etc/kafka/zookeeper.properties ; 管理命令,supervisor不支持后台进程
process_name=%(program_name)s
user=root ;进程启动用户
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/tail1.err.log ;标准输出的位置
stdout_logfile=/tmp/tail1.out.log ;标准错误输出的位置
loglevel=info ;日志的级别
[program:kafka]
command=/data/confluent/bin/kafka-server-start /data/confluent/etc/kafka/server.properties ;管理命令,supervisor不支持后台进程
process_name=%(program_name)s
user=root ;进程启动用户
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/tail2.err.log ;标准输出的位置
stdout_logfile=/tmp/tail2.out.log ;标准错误输出的位置
loglevel=info ;日志的级别
[program:schema-registry]
command=/data/confluent/bin/schema-registry-start /data/confluent/etc/schema-registry/schema-registry.properties ;管理命令,supervisor不支持后台进程
process_name=%(program_name)s
user=root ;进程启动用户
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/tail3.err.log ;标准输出的位置
stdout_logfile=/tmp/tail3.out.log ;标准错误输出的位置
loglevel=info ;日志的级别
[program:kafka-rest]
command=/data/confluent/bin/kafka-rest-start /data/confluent/etc/kafka-rest/kafka-rest.properties ;管理命令,supervisor不支持后台进程
process_name=%(program_name)s
user=root ;进程启动用户
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/tail4.err.log ;标准输出的位置
stdout_logfile=/tmp/tail4.out.log ;标准错误输出的位置
loglevel=info ;日志的级别
[program:connect]
command=/data/confluent/bin/connect-distributed /data/confluent/etc/schema-registry/connect-avro-distributed.properties ;管理命令,supervisor不支持后台进程
process_name=%(program_name)s
user=root ;进程启动用户
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/tail5.err.log ;标准输出的位置
stdout_logfile=/tmp/tail5.out.log ;标准错误输出的位置
loglevel=info ;日志的级别
[program:ksql-server]
command=/data/confluent/bin/ksql-server-start /data/confluent/etc/ksql/ksql-server.properties ;管理命令,supervisor不支持后台进程
process_name=%(program_name)s
user=root ;进程启动用户
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/tail6.err.log ;标准输出的位置
stdout_logfile=/tmp/tail6.out.log ;标准错误输出的位置
loglevel=info ;日志的级别
[program:control-center]
command=/data/confluent/bin/control-center-start /data/confluent/etc/confluent-control-center/control-center-dev.properties ;管理命令,supervisor不支持后台进程
process_name=%(program_name)s
user=root ;进程启动用户
autostart=true ;是否随supervisor启动
autorestart=true ;是否在挂了之后重启,意外关闭后会重启,比如kill掉!
startretries=3 ;启动尝试次数
stderr_logfile=/tmp/tail7.err.log ;标准输出的位置
stdout_logfile=/tmp/tail7.out.log ;标准错误输出的位置
loglevel=info ;日志的级别
[include]
files=/etc/supervisor/conf.d/*.conf

以上配置文件用到几个部分:
[unix_http_server]:这部分设置HTTP服务器监听的UNIX domain socket

  • file:指向UNIX domain socket,即file=/tmp/supervisor.sock
  • chmod:启动时改变supervisor.sock的权限

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

  • logfile: 指向记录supervisord进程的log文件
  • pidfile:pidfile保存子进程的路径
  • childlogdir:子进程log目录设为AUTO的log目录

[supervisorctl]:

  • serverurl:进入supervisord的URL, 对于UNIX domain sockets, 应设为unix:///tmp/supervisor.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备份的数量

为了方便查看,在此配置文件中直接将[program:x]写在主配置文件,示例中几个服务为confluent kafka的启动进程。
启动

1
supervisord -c /etc/supervisord.conf

启动完成后验证服务、进程、端口是否正常。
关闭:

1
supervisorctl shutdown

管理命令(”-c /etc/supervisord.conf”可以省略)

1
2
3
4
5
6
7
8
9
10
11
12
supervisorctl -c /etc/supervisord.conf status              #查看状态
supervisorctl -c /etc/supervisord.conf reload #重新载入配置文件
supervisorctl -c /etc/supervisord.conf start [all]|[x] #启动所有/指定的程序进程
supervisorctl -c /etc/supervisord.conf stop [all]|[x] #关闭所有/指定的程序进程
supervisorctl stop program_name # 停止某一个进程,program_name 为 [program:x] 里的 x
supervisorctl start program_name # 启动某个进程
supervisorctl restart program_name # 重启某个进程
supervisorctl stop groupworker: # 结束所有属于名为 groupworker 这个分组的进程 (start,restart 同理)
supervisorctl stop groupworker:name1 # 结束 groupworker:name1 这个进程 (start,restart 同理)
supervisorctl stop all # 停止全部进程,注:start、restartUnlinking stale socket /tmp/supervisor.sock、stop 都不会载入最新的配置文件
supervisorctl reload # 载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程
supervisorctl update # 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

安装supervisord-monitor(可选)

supervisord-monitor是对supervisord的一个集中化管理工具,可以对supervisor统一化操作。

1
2
3
4
5
#下载
git clone https://github.com/mlazarov/supervisord-monitor.git
# 生成配置文件
cd supervisord-monitor/
cp application/config/supervisor.php.example application/config/supervisor.php

修改配置文件,添加supervisord主机展示名url服务器地址port端口

1
2
3
4
5
6
7
8
$config['supervisor_servers'] = array(
'host103' => array(
'url' => 'http://localhost/RPC2',
'port' => '9001',
'username' => 'admin',
'password' => '123456'
),
);

添加nginx对supervisord-monitor的支持

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server {
listen 82;
server_name localhost;
set $web_root /data/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;
}

}

重启nginx后,访问即可。

本文标题:Supervisor的作用与配置实例

文章作者:Francis

原始链接:http://www.cnops.com/posts/f0ff2220.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。