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/


浙公网安备 33010602011771号