title: 01-基本概述
order: 1
icon: lightbulb
1.理论
在Linux下,Supervisord是一个常用的进程管理工具。它允许你监控和控制在操作系统上运行的进程。具体而言,Supervisor 提供了一种简单而有效的方式来启动、停止、重新启动和管理进程。它可以确保进程在意外退出时能够自动重新启动,并提供简单的日志记录和监控功能。通过使用 Supervisor,你可以轻松管理多个进程,并在需要时进行配置和调整。
2.进程管理服务配置信息
supervisor进程管理服务程序安装完毕后,会在系统中生成两个主要的配置文件(通过pip安装的是没有这个两个文件的):
主配进程配置文件:/etc/supervisord.conf
子配进程配置文件:/etc/supervisord.d/
主配置文件常用信息
[unix_http_server]
file=/tmp/supervisor.sock ; socket套接字文件,用于客户端与服务端建立本地连接
chmod=0700 ; socket文件权限,默认是0700
chown=nobody:nogroup ; socket文件属主与属组信息设定,格式:uid:gitd
[inet_http_server] ;
port=127.0.0.1:9001 ; web管理后台运行的ip和端口
username=user ; 后台登录用户名
password=123 ; 后台登录密码
[supervisord]
logfile=/tmp/supervisord.log ; 服务运行的日志文件
logfile_maxbytes=50MB ; 日志大小文件,超出会rotate,默认50M,若值为0表示不限制大小
logfile_backups=10 ; 日志保留文件数量为10,设为0表示不备份
loglevel=info ; 日志级别,默认info,其它:debug,warn,trance
pidfile=/tmp/supervisord.pid ; pid文件
nodaemon=false ; 是否在前台启动,默认是false,即以daemon的方式启动
minfds=1024 ; 可以打开文件描述的最小值,默认是1024
minprocs=200 ; 可以打开进程数的最小值,默认是200
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
serverurl=http://127.0.0.1:9001 ; 通过http的方式连接supervisord
[program:xx]
command=/bin/cat ; 程序的启动命令
autostart=true ; 在supervisord启动的时候也启动
startsecs=10 ; 启动10秒后没有异常退出,就表示正常启动了,默认为1秒
autorestart=true ;程序退出后自动重启,可选值:【unexpected,true,false】默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=chrism ; 用哪个用户启动,默认是root
priority=999 ; 进程启动优先级,默认是999,最小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认是false
stdout_logfile_maxbytes=50MB ; stdout日志文件大小,默认50M
stdout_logfile_backups=10 ; stdout日志文件备份数,默认是10
stdout_logfile=/a/path ; stdout日志文件,指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件)
stopasgroup=false ; 默认为false,进程被杀死时,是否向这个进程发送stop信号,包括子进程
killasgroup=false ; 默认为false,像进程组发送kill信息,包括子进程
[include]
files = relative/directory/*.ini ;可以指定一个或者多个以.ini结束的配置文件
子配置文件脚本信息
# 项目名称
[program:usercenter]
# 脚本目录
directory = /home/leon/projects/usercenter
# 脚本执行命令
command = gunicorn -c gunicorn.py wsgi:app
# 在supervisord启动的时候也启动
autostart = true
# 启动 5 秒后没有异常退出,就当作已经正常启动了
startsecs = 5
# 程序异常退出后自动重启
autorestart = true
# 启动失败自动重试次数,默认是 3
startretries = 3
# 用哪个用户启动
user = leon
# 把 stderr 重定向到 stdout,默认 false
redirect_stderr = true
# stdout 日志文件大小,默认 50MB
stdout_logfile_maxbytes = 20MB
# stdout 日志文件备份数
stdout_logfile_backups = 20
# stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /data/logs/usercenter_stdout.log
3.supervisor进程管理服务组成
supervisor主要包括以下四个核心部分组成:
- supervisord:
这是supervisor服务的主要管理器,运行 Superyisor 时会启动一个进程 supervisord,它负责启动所管理的进程;并将所管理的进程作为自己的子进程来启动,而且可以在所管理的进程出现崩溃时自动重启。- supervisorctl:
这是supervisor服务的客户端命令行工具,可以用来执行 stop、start、restart 等命令,来对这些子进程进行管理。- web Server:
这是supervisor服务的网页可视化界面,可以通过web界面查看和控制进程状态,简化了对操作命令的学习:- xml-rpcinterface:
服务与web ui的同一个http服务器,提供一个xml-rpc接口,可以用来询问和控制管理程序及其他运行的程序,
4.supervisor运行环境
supervisor可以运行在大多数类unix系统,但是不能运行在任何windows系统,supervisor运行在python环境中可以在python (2.7) 版本上工作、python3 (3.4) 版本上工作、以及更高python版本上。
5.相关命令
5.1.启动命令
supervisord -c /etc/supervisord.conf
5.2.其它命令
supervisorctl stop project:停止某一个进程(programxxx)
supervisorctl start project:启动某个进程
supervisorctl restart project:重启某个进程
supervisorctl stop groupworker:重启所有属于名为groupworker的进程
supervisorctl stop all:停止全部进程
supervisorctl reload:重新载入配置文件
supervisorctl update:修改某个进程:
6.通过dockerfile制作supervisor镜像
6.1.使用centos7作为基础镜像
编写supervisor配置脚本
[root@172-0-110-100 ~]# mkdir supervisor && cd supervisor
[root@172-0-110-100 supervisor]# cat supervisor_startup.sh
#!/bin/bash
if grep -q "$(ifconfig eth0 | grep -oE 'inet ([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print $2}')" /etc/supervisord.conf; then
supervisord -c /etc/supervisord.conf
else
sed -i 's#supervisord.d#/etc/supervisord.d#' /etc/supervisord.conf
echo "[inet_http_server]" >> /etc/supervisord.conf
echo "port=$(ifconfig eth0 | grep -oE "inet ([0-9]{1,3}\.){3}[0-9]{1,3}" | awk "{print \$2}"):9001" >> /etc/supervisord.conf
echo "username=admin" >> /etc/supervisord.conf
echo "password=123" >> /etc/supervisord.conf
supervisord -c /etc/supervisord.conf
fi
echo "脚本执行成功,查看supervisord日志"
tail -F /var/log/supervisor/supervisord.log
```
编写dockerfile文件
[root@172-0-110-100 supervisor]# vim Dockerfile
#基础镜像
FROM centos:7
#安装使用工具和supervisor服务
RUN yum -y install epel-release && yum -y install wget && yum -y install iproute && yum -y install net-tools && yum -y install supervisor
RUN mkdir -p /etc/supervisord.d/
#配置supervisor脚本
supervisor_startup.sh /root/supervisor_startup.sh
#配置脚本执行权限
RUN chmod +x /root/supervisor_startup.sh
EXPOSE 9001
CMD ["./root/supervisor_startup.sh"]
```
构建镜像
[root@172-0-110-100 supervisor]# docker build -t supervisor/os7:1.0 .
[+] Building 0.5s (10/10) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 475B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:7 0.0s
=> [1/5] FROM docker.io/library/centos:7 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 722B 0.0s
=> CACHED [2/5] RUN yum -y install epel-release && yum -y install wget && yum -y install iproute && yum -y install net-tools && yum -y install supervisor 0.0s
=> CACHED [3/5] RUN mkdir -p /etc/supervisord.d/ 0.0s
=> [4/5] supervisor_startup.sh /root/supervisor_startup.sh 0.0s
=> [5/5] RUN chmod +x /root/supervisor_startup.sh 0.4s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:97b52cd0def8f6e83e4a9618009d5cc543e7ad3d417cc4d4da9b9eb3b51c4549 0.0s
=> => naming to docker.io/supervisor/os7:1.0 0.0s
```
测试
[root@172-0-110-100 supervisor]# docker run -itd --name os7 -p 9001:9001 supervisor/os7:1.0
98072281427ee66d3c44abc26830cd0df15dbba8f441d331ef04351531c208ec
[root@172-0-110-100 supervisor]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
98072281427e supervisor/os7:1.0 "./root/supervisor_s…" 6 seconds ago Up 5 seconds 0.0.0.0:9001->9001/tcp, :::9001->9001/tcp os7
6.2.使用centos8作为基础镜像
提前准备好cnetos8的yum文件,去阿里云下载
编写脚本文件
[root@172-0-110-100 ~]# mkdir supervisor_os8 && cd supervisor_os8/
[root@172-0-110-100 supervisor_os8]# vim supervisor_startup.sh
#!/bin/bash
if grep -q "$(ip addr show eth0 | grep -oE 'inet ([0-9]{1,3}\.){3}[0-9]{1,3}' | awk '{print $2}')" /etc/supervisord.conf; then
supervisord -c /etc/supervisord.conf
else
sed -i 's#supervisord.d#/etc/supervisord.d#' /etc/supervisord.conf
echo "[inet_http_server]" >> /etc/supervisord.conf
echo "port=$(ip addr show eth0 | grep -oE "inet ([0-9]{1,3}\.){3}[0-9]{1,3}" | awk "{print \$2}"):9001" >> /etc/supervisord.conf
echo "username=admin" >> /etc/supervisord.conf
echo "password=123" >> /etc/supervisord.conf
supervisord -c /etc/supervisord.conf
fi
echo "脚本执行成功,查看supervisord日志"
tail -F /var/log/supervisor/supervisord.log
```
编写dockerfile文件
[root@172-0-110-100 ~]# mkdir supervisor_os8
[root@172-0-110-100 ~]# cd supervisor_os8/
[root@172-0-110-100 supervisor_os8]# ls
Centos-8.repo
[root@172-0-110-100 supervisor_os8]# vim Dockerfile
FROM centos:8
RUN rm -rf /etc/yum.repos.d/*
Centos-8.repo /etc/yum.repos.d/Centos-8.repo
RUN yum -y install epel-release && yum -y install wget && yum -y install vim && yum -y install supervisor
RUN mkdir -p /etc/supervisord.d/
#配置supervisor脚本
supervisor_startup.sh /root/supervisor_startup.sh
#配置脚本执行权限
RUN chmod +x /root/supervisor_startup.sh
EXPOSE 9001
CMD ["./root/supervisor_startup.sh"]
构建镜像
省略
启动容器测试
[root@172-0-110-100 ~]# docker run -itd --name os8 -p 9001:9001 supervisor/os8:1.0
[root@172-0-110-100 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
eeb07ee7ad00 supervisor/os8:1.0 "./root/supervisor_s…" 4 minutes ago Up About a minute 0.0.0.0:9001->9001/tcp, :::9001->9001/tcp os8
评论区