Supervisor

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台服务,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。

安装

1
2
3
4
5
6
7
# centos 7
yum install python-setuptools
easy_install supervisor

# centos 8
yum install epel-release
yum install supervisor

配置文件

  • 创建文件夹
1
2
3
4
5
6
mkdir -p /etc/supervisor/conf.d
mkdir -p /var/log/supervisor

# centos 8
/etc/supervisord.conf # supervisord 自身配置文件
/etc/supervisord.d # 服务配置文件存放位置
  • 创建配置文件
1
2
3
touch /etc/supervisor/supervisord.conf

# centos 8 yum 方式安装自动生成上面的配置文件不需要手动创建
  • 写入配置文件内容
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
# supervisord.conf
; supervisor config file

[inet_http_server] ; inet (TCP) server disabled by default
port=*:9066 ; (ip_address:port specifier, *:port for all iface)
username=root ; (default is no username (open server))
password=root ; (default is no password (open server))


[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
;chmod=0700 ; sockef file mode (default 0700)

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket

; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.

[include]
files = /etc/supervisor/conf.d/*.conf ; 指定需要守护进程的配置文件位置

守护程序配置

配置文件需要存放在/etc/supervisor/conf.d/,此位置是上面的配置文件中最后一行指定的。

注意: 如果startsecs设置为 0 将关闭异常退出检测,supervisor会不停的尝试重启被守护的进程

1
2
3
4
5
6
7
8
9
10
11
12
13
; 示例设置
[program:xxx]
directory=/opt/xxx/server ; 工作目录位置
command=/opt/xxx/server/server ; 执行命令
autostart=true ; supervisord守护程序启动时自动启动
autorestart=true ; supervisord守护程序重启时自动重启
startsecs=0 ; 单位秒,设置程序运行多久退出为正常退出,否则为异常退出,异常退出达到最大重试次数,将不在尝试启动程序
startretries=5 ; 程序异常重试次数
exitcodes=0 ; 指定正常退出代码
redirect_stderr=true ; 将stderr重定向到stdout
stdout_logfile = /opt/log/xxx.log
stdout_logfile_maxbytes=2MB ; 日志文件滚动大小 (default 50MB)
stdout_logfile_backups=5 ; 日志文件备份数量 (default 10)

启动 supervisor

启动方式分为手动启动和托管 systemd 两种方式

手动

1
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf

systemd

  • 创建文件:vim /lib/systemd/system/supervisord.service
  • 内容如下
1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Process Monitoring and Control Daemon
After=rc-local.service nss-user-lookup.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisord shutdown
ExecReload=/usr/bin/supervisord reload
killMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
  • 执行systemctl enable supervisord.service设置为开机自启
  • 执行systemctl start supervisord启动服务

网页管理

根据上面 supervisord的配置文件中inet_http_server的指定,访问对应的端口,并输入用户名和密码

我们访问网页即可看到我们配置的所有守护程序。