Linux-Supervisor进程管理

1、Supervisor基本概述

1.1、什么是supervisor

supervisor是一个进程管理服务,主要用来将运行在前台的进程转为后台运行,并实时监控进程的状态。当出现异常时会自动将该进程拉起。

1.2、为什么要使用supervisor

其实在我们维护的Linux服务中,有不少程序没有启停脚本,并且还是前台运行,比如Python程序。当然熟悉Linux的朋友会考虑使用&符号、或screen,将其转为后台进程。
但这些方式仅仅只是将进程放置后台,当我们想要重启服务时,需要先kill进程、然后在挂后台,比较复杂。而Supervisor 则不同,它能实现:
1、将前台运行进程转为后台进程。 2、监控进程运行情况,如果进程异常退出,会自动重新启动进程。
3、能对服务进行启动、重启、关闭等便捷的操作。 4、提供web ui界面,便于开发人员使用。

1.3、Supervisor基础组件

1.3.1、supervisord

主进程,负责管理进程的服务,对crash的进程重启,对进程变化发送事件通知等。

1.3.2、supervisorctl

supervisorctl命令行管理工具,可以利用它来查看被管理的进程状态,启动停止/重启进程,获取running子进程的列表等。
supervisorctl不仅可以连接到本机的supervisord,还可以连接远程的supervisord,当然在本机上面是通过UNIX socket连接的,远程是通过TCP socket连接的。 supervisorctl和supervisord之间的通信,是通过xml_rpc完成的。

1.3.3、web server

supervisor提供了web server功能,可通过web控制进程(需要设置[inethttpserver]配置项。

1.3.4、XML-RPC Interface

远程调用服务,通过HTTP协议提供的Web服务,用来控制supervisor 以及 Supervisor运行的进程。

1.4、supervisorctl使用

supervisorctl reread          ;重新加载配置文件
supervisorctl update          ;将配置文件里新增的子进程加入进程组,如果设置了autostart=true则会启动新新增的子进程
supervisorctl status          ;查看所有进程状态
supervisorctl status <name>   ;查看指定进程状态
supervisorctl start all       ; 启动所有子进程
supervisorctl start <name>    ; 启动指定子进程
supervisorctl restart all     ; 重启所有子进程
supervisorctl restart <name>  ; 重启指定子进程
supervisorctl stop all        ; 停止所有子进程
supervisorctl stop <name>     ; 停止指定子进程
supervisorctl reload          ; 重启supervisord
supervisorctl add <name>      ; 添加子进程到进程组
supervisorctl reomve <name>   ; 从进程组移除子进程,需要先stop。注意:移除后,需要使用reread和update才能重新运行该进程

2、Supervisor安装配置

2.1、Supervisor安装

yum install epel-release -y
yum install supervisor -y

2.2、Supervisor配置解析

]# vi /etc/supervisord.conf 

2.2.1、[unix_http_server]

[unix_http_server]
file=/var/run/supervisor/supervisor.sock   ; supervisorctl与supervisor通讯方式
;chmod=0700                 ; socket文件的权限,默认0700
;chown=nobody:nogroup       ; socket文件的属主与属组
;username=user              ; 使用supervisorctl连接时,认证的用户(非必选)
;password=123               ; 使用supervisorctl连接时,认证的密码(非必选)

2.2.2、[inet_http_server]

[inet_http_server]         ; 监听在TCP协议,webServer需要使用,远程连接也需要使用
port=127.0.0.1:9001        ; 访问webServer时使用的地址、端口
username=user              ; 访问webServer的用户名称
password=123               ; 访问webServer的用户名称

2.2.3、[supervisord]

[supervisord]                               ; 这个主要是定义supervisord这个服务端进程的一些参数的
logfile=/var/log/supervisor/supervisord.log  ; supervisord进程日志
logfile_maxbytes=50MB       ; 默认日志存储50m,会进行自动切割
logfile_backups=10          ; 日志文件数量,程序启动会创建10个backup文件,用于Log rotate
loglevel=info               ; 日志级别,默认info,(debug , warn ,trace)
pidfile=/var/run/supervisord.pid ; supervisord pid文件
nodaemon=false              ; 默认守护进程运行, true则supervisord前台运行
minfds=1024                 ; 系统最少空闲的文件描述符,低于这个值supervisor将不会启动
minprocs=200                ; 进程最小可用文件描述符,低于这个值supervisor将不会正常启动
;umask=022                  ; 进程创建文件的掩码,默认umask 022)
;user=chrism                 ; 设置一个普通用户,后期可以通过该普通用户对supervisord进行管理
;identifier=supervisor       ; supervisord的标识,如果有多个则需要设置不同的标识
;directory=/tmp              ; 启动supervisord进程之前,会切换到该目录(可不配置)
;nocleanup=true              ; false会在进程启动时,将以前子进程产生的日志文件(路径为AUTO)的清除掉
;childlogdir=/tmp            ; 当子进程日志路径为AUTo时,子进程日志文件存储至/tmp
;environment=KEY=value       ; 设定环境变量,子配置文件会继承主进程定义的环境变量
;strip_ansi=false            ; true会清除子进程日志中的所有ANSI序列。也就是日志中的\n,\t默认为false

2.2.4、[supervisorctl]

[supervisorctl]      ;这个主要是supervisorctl的一些配置
serverurl=unix:///var/run/supervisor/supervisor.sock ; 本地unix socket路径,注意和[unix_http_server] file对应上
;serverurl=http://127.0.0.1:9001 ; supervisorctL的WebServer连接地址
;username=chris              ; webserver设定的用户名称
;password=123                ; WebServer设定的密码
;prompt=mysupervisor         ; 输入用户名密码时候的提示符,默认supervisor
;history_file=~/.sc_history  ; 历史记录,通过该文件查找历史记录

2.2.5、[program:theprogramname] 

;[program:theprogramname]      ; program是要被管理的进程,填写相应进程名称即可
;command=/bin/cat              ; 启动进程的命令路径,可以携带参数
;process_name=%(program_name)s ; 进程名称,默认获取program设定的名称
;numprocs=1                    ; 启动进程的数量
;directory=/tmp                ; 运行进程会切换到该目录
;umask=022                     ; 进程掩码,默认None
;priority=999                  ; 子进程启动和关闭的优先级,优先级低先启动,关闭时最后关闭
;autostart=true                ; 启动supervisord后启动被管理的子进程
;autorestart=true              ; 当子进程挂掉后会自动重启
;startsecs=10                  ; 子进程启动后多少秒,则认为成功启动
;startretries=3                ; 子进程启动失败,最大尝试启动的次数
;exitcodes=0,2                 ; 定义退出的状态码、0或2
;stopsignal=QUIT               ; 进程停止信号、默认TERM
;stopwaitsecs=10               ; 向子进程发送stopsignal信号,如果超过等待时间,则强制kill子进程
;user=chrism                   ; 设置非root用户管理该program
;redirect_stderr=true          ; 如果为true,则stderr的日志会被写入stdout日志文件中默为false
;stdout_logfile=/a/path        ; 子进程的stdout的日志路径,可以指定路径,AUTO,none等
;stdout_logfile_maxbytes=1MB   ; 日志文件最大大小,默认为50M
;stdout_logfile_backups=10     ; 备份文件数量
;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stdout_events_enabled=false   ; emit events on stdout writes (default false)
;stderr_logfile=/a/path        ; 设置stderr写的日志路径
;stderr_logfile_maxbytes=1MB   ; 错误日志文件最大大小,默认为50M
;stderr_logfile_backups=10     ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false   ; 该子进程的环境变量,和别的子进程不进行共享
;environment=A=1,B=2           ; 进程环境变量
;serverurl=AUTO                ; override serverurl computation (childutils)

2.2.6、[group:thegroupname]、[include]

;[group:thegroupname]
;programs=progname1,progname2  ; 为programs分组,方便进行统—操作组的成员进程,用逗号分开
;priority=999                  ; 优先级

[include]
files = supervisord.d/*.ini    ; 包含supervisord. d目录下的所有.ini文件

3、Supervisor管理后台程序

3.1、Supervisor管理Python

3.1.1、安装python环境

yum install openssl-devel bzip2-devel expat-devel \
gdbm-devel readline-devel sqlite-devel gcc gcc-c++ \
openssl-devel zlib zlib-devel python3 python3-devel -y

3.1.2、升级pip

pip3 install -i https://mirrors.aliyun.com/pypi/simple/ --upgrade pip

3.1.3、安装django

pip3 install -i https://mirrors.aliyun.com/pypi/simple/ django==3.2.18

3.1.4、需要升级sqlite

(获取安装包下载链接
下载地址:https://www.sqlite.org/download.html

curl -o sqlite-autoconf-3410200.tar.gz https://www.sqlite.org/2023/sqlite-autoconf-3410200.tar.gz tar xvf sqlite-autoconf-3410200.tar.gz && cd sqlite-autoconf-3410200 && ./configure && make && make install

  mv /usr/bin/sqlite3 /usr/bin/sqlite3_old
  ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3

echo "export LD_LIBRARY_PATH="/usr/local/lib"" >>/etc/profile

]# sqlite3 --version 3.41.2 2023-03-22 11:56:21 0d1fc92f94cb6b76bffe3ec34d69cffde2924203304e8ffc4155597af0c191da

3.1.5、创建一个django项目

django-admin startproject demo_site
cd demo_site/
python3 manage.py runserver 0.0.0.0:8000

3.1.6、编写Supervisor管理Python的ini配置文件

cat > /etc/supervisord.d/django.ini <<'EOF'
[program:django]
directory=/opt/demo_site
command=/bin/bash -c "python3 manage.py runserver 0.0.0.0:8000"
autostart=true
autorestart=true
startsecs=5
startretries=3
user=root
stopsignal=TERM
stdout_logfile=/var/log/django_stdout.log
stderr_logfile=/var/log/django_stderr.log
stopasgroup=true
killasgroup=true
EOF

3.1.7、启动supervisord服务

systemctl start supervisord
systemctl enable supervisord

3.1.8、查询状态

]# supervisorctl status
django                           RUNNING   pid 4553, uptime 0:01:43

3.2、Supervisor管理Java

3.2.1、安装java环境

yum install java -y

3.2.2、下载测试项目

wget https://gitee.com/chejiangyi/dingding-sonar/repository/archive/master.zip
unzip master.zip

3.2.3、 手动测试项目是否要以跑起来

wget https://gitee.com/chejiangyi/dingding-sonar/repository/archive/master.zip
yum install unzip -y
unzip master.zip
cd dingding-sonar-master/releases/
java -jar dingding-sonar-1.0-SNAPSHOT.jar --server.port=8080

 3.2.4、编写Supervisor管理Java的ini配置文件

cat > /etc/supervisord.d/dingding-sonar.ini 'EOF'
[program:sonar]
directory=/opt/sonar
command=/bin/bash -c "java -jar /opt/sonar/dingding-sonar-1.0-SNAPSHOT.jar --server.port=8080"
autostart=true
autorestart=true
startsecs=5
startretries=3
user=root
stopsignal=QUIT
stdout_logfile=/var/log/dingding_sonar_stdout.log
stderr_logfile=/var/log/dingding_sonar_stderr.log
stopasgroup=true
killasgroup=true
EOF

3.2.5、重新加载supervisor服务‘

supervisorctl start sonar

3.2.6、查询运行状态

# supervisorctl status
django                           RUNNING   pid 5136, uptime 0:01:27
sonar                            RUNNING   pid 5135, uptime 0:01:27

4、Supervisor-Web页面

4.1、编辑supervisor主配置文件

]# vi /etc/supervisord.conf 
[inet_http_server] 
port=0.0.0.0:9001
username=cyc
password=123

4.2、重启服务

systemctl restart supervisord

4.3、访问测试

http://192.168.10.36:9001/

 

posted @ 2023-04-24 11:37  小粉优化大师  阅读(1256)  评论(0)    收藏  举报