Supervisor服务管理熟悉

需求背景

  1. 最近恰逢自己服务器到期了,使用腾讯云的镜像功能在安装新系统时使用旧系统的镜像安装完成
  2. 这时到新服务器会发现,基本所有服务都停止了,需要自己手动各类服务如redis、nginx、docker等
    1. 包括服务器关机再开机时,所有服务也是停止状态
    2. 当然这里可以将各类服务加入到system启动项里面(后续再探索)

一阶段

  1. 第一阶段解决办法:编写一个总shell脚本,在服务器开机时,手动执行这个脚本去检测各类服务是否正常

    1. 如果是停止的,则去启动服务

    2. 如果在运行中,则提示服务已经运行

      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
      #!/bin/bash
      # 关机或重启后,执行本脚本启动各类服务
      # docker
      docker_sum=`ps -ef | grep docker | grep -v grep | awk '{print $2}' | wc -l`
      # nginx
      nginx_sum=`ps -ef | grep nginx | grep -v grep | awk '{print $2}' | wc -l`
      # 测试平台demo
      java_sum=`ps -ef | grep java | grep -v grep | awk '{print $2}' | wc -l`
      # redis
      redis_sum=`ps -ef | grep redis | grep -v grep | awk '{print $2}' | wc -l`

      if [ $nginx_sum -ne 0 ]
      then
      echo "---------nginx is already running---------"
      else
      cd /usr/local/nginx/
      ./sbin/nginx -c ./conf/nginx.conf
      nginx_sum=`ps -ef | grep nginx | grep -v grep | awk '{print $2}' | wc -l`
      if [ $nginx_sum -ne 0 ]
      then
      echo "-------nginx is start---------"
      else
      echo "------nginx start failed-------"
      fi
      fi
    3. 执行效果如下

      image-20241014105424392

二阶段

  1. 受到现有开发在服务器上重启服务和想起第一家公司带我的大佬影响用的命令
  2. 想起了supervisor这个命令,于是就百度搜索了一番,最终成功,下面是此次过程记录

安装过程

安装Supervisor有多种方式

  1. easy_install安装supervisor
  2. pip安装supervisor
  3. yum epel-release安装supervisor

前面两种都需要python环境最好大于2.6,这里我选择的是第三种方式

1
yum install -y epel-release && yum install -y supervisor
  1. 安装好后可以查看三个可以执行的程序

    1
    2
    3
    4
    5
    6
    [root@VM-16-5-centos ~]# which supervisord
    /usr/bin/supervisord
    [root@VM-16-5-centos ~]# which supervisorctl
    /usr/bin/supervisorctl
    [root@VM-16-5-centos ~]# which echo_supervisord_conf
    /usr/bin/echo_supervisord_conf

配置supervisor

  1. 修改配置文件

    1
    2
    3
    4
    5
    6
    #修改socket文件的mode,默认是0700
    sed -i 's/;chmod=0700/chmod=0766/g' /etc/supervisord.conf

    #在配置文件最后添加以下两行内容来包含/etc/supervisord目录
    sed -i '$a [include] \
    files = /etc/supervisord.d/*.conf' /etc/supervisord.conf
  2. 启动supervisor服务

    1
    2
    3
    systemctl start supervisor.service
    # 或者
    supervisord -c /etc/supervisord.conf
  3. 查看服务状态(running即为正常)

    1
    systemctl status supervisor.service

加入开机自启动

  1. 开机启动时,自动带起supervisor服务

    1
    systemctl enable supervisor.service 

编写管理服务文件

想要我们的应用服务被Supervisor管理,就需要在/etc/supervisord目录下编写配置文件

java应用中jar包启动例子

jar包案例如下

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
vim /etc/supervisord.d/testPt.conf

#程序唯一名称
[program:testPt]
#运行程序的命令
command=java -jar /usr/cxl/my-project-backend-0.0.1-SNAPSHOT.jar
#是否在supervisord启动后jar包也启动
autostart=true
#启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
startsecs=10
#程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启;意思为如果不是supervisord来关闭的该进程则认为不正当关闭,supervisord会再次把该进程给启动起来,只能使用该supervisorctl来进行关闭、启动、重启操作
autorestart=true
#启动失败自动重试次数,默认是3
startretries=3
#用哪个用户启动进程,默认是root
user=root
#进程启动优先级,默认999,假如Supervisord需要管理多个进程,那么值小的优先启动
priority=999
stopsignal=INT
redirect_stderr=true
#stdout标准输出日志文件大小,日志文件大小到200M后则进行切割
stdout_logfile_maxbytes=50MB
#stdout标准输出日志文件备份数,保存10个50MB的日志文件,超过10个后老的将被删除,默认为10保存10个
stdout_logfile_backups=10
stderr_logfile=/usr/cxl/log/testPt.err.log
#标准日志输出位置,如果输出位置不存在则会启动失败
stdout_logfile=/usr/cxl/log/testPt.out.log

重新加载文件及启动

在新增了服务管理配置文件后,需要重启Supervisor服务或者保险一点,重新加载后,再重启

1
2
3
4
5
6
7
8
9
10
#  Supervisor 重新加载配置文件
supervisorctl reread
supervisorctl update
# 启动新增加的配置文件服务(此处是 testPt)
supervisorctl start testPt

# 查看Supervisor已有服务的状态
[root@VM-16-5-centos supervisord.d]# supervisorctl status all
testPt RUNNING pid 12022, uptime 2 days, 20:47:03

  1. 可以看到这个testPt服务已经启动,因为是java应用,所以我们也可以(java这个服务已经启动)

    1
    2
    3
    [root@VM-16-5-centos supervisord.d]# ps -ef | grep java
    root 10602 920 0 13:40 pts/0 00:00:00 grep --color=auto java
    root 12022 9921 0 10月11 ? 00:05:20 java -jar /usr/cxl/my-project-backend-0.0.1-SNAPSHOT.jar

常用命令

  1. supervisor常用的命令

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #  Supervisor 重新加载配置文件
    supervisorctl reread
    supervisorctl update
    # 所有服务
    supervisorctl status all # 查看所有服务的进程状态
    supervisorctl stop all # 停止所有服务
    supervisorctl start all # 启动所有服务
    supervisorctl restart all # 重启所有服务
    supervisorctl reload all # 重载所有服务

    # 针对某一个服务的管理
    supervisorctl status testPt # 查看该服务的进程状态
    supervisorctl stop testPt # 停止该服务
    supervisorctl start testPt # 启动该服务
    supervisorctl restart testPt # 重启该服务
    supervisorctl reload testPt # 重载该服务