侧边栏壁纸
博主头像
一揽芳华 博主等级

行动起来,活在当下

  • 累计撰写 265 篇文章
  • 累计创建 24 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

01.基本概述

芳华是个男孩!
2024-10-14 / 0 评论 / 0 点赞 / 7 阅读 / 0 字
广告 广告

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

0
广告 广告

评论区