supervisor


官网 Supervisor

Supervisor 是一个客户端服务器系统,允许其用户监视和控制类似UNIX的操作系统上的多个进程。

Supervisor 是用 Python 开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。supervisor还提供了一个功能,可以为supervisord或者每个子进程,设置一个非rootuser,这个user就可以管理它对应的进程。

但是需要注意 Supervisor 完全不会在任何Windows版本下运行,它依赖于 Python , 它适用于Python 3 3.4版或更高版本以及Python 2版本2.7

主要功能:

  1. 进程管理:Supervisor可以启动、停止和重启进程。用户可以通过命令行或Web界面管理这些进程。
  2. 自动重启:如果监控的进程意外退出,Supervisor可以自动重启它,从而提高系统的稳定性。
  3. 日志管理:Supervisor会自动捕获和管理各个进程的标准输出和错误日志,便于后续排查问题。
  4. 配置灵活:Supervisor通过配置文件定义要管理的进程,可以指定启动命令、环境变量、工作目录等参数。
  5. 支持多种语言:Supervisor可以管理用多种编程语言编写的进程,包括Python、Java、Ruby等。
  6. Web界面:Supervisor提供一个Web界面,便于用户查看进程状态和管理进程。

使用场景

  • 守护进程:适合需要常驻运行的服务,如Web服务器或数据库。
  • 批处理任务:可以用于监控并管理定时任务或批处理进程。
  • 微服务架构:在微服务环境中,Supervisor可以帮助管理多个服务实例。

命令选项

supervisorctl status 				# 查看所有受管理进程的状态。
supervisorctl start <program> 		 # 启动所有进程  #启动一个或多个进程
supervisorctl start all  			# 启动所有进程
supervisorctl stop <program>		# 停止所有进程  #启动一个或多个进程
supervisorctl stop all    			# 停止所有进程
supervisorctl tail <program>		# 查看特定进程的标准输出或错误输出日志。
supervisorctl tail <program> stderr  # 查看错误日志
supervisorctl reload				# 重新加载配置文件
supervisorctl shutdown				# 停止Supervisor进程及其管理的所有进程。

	-c <config_file>   ##指定要使用的配置文件,通常用于启动 supervisord。
	-n 				  ## 以前台模式启动,不会在后台运行。
	-h 或 --help       ##显示帮助信息和可用的命令列表。

应用实例(3.4.0)

## 安装
yum install -y supervisor

## 启动并加入开启自启
systemctl enable supervisord.service --now


[root@master alertmanager]# rpm -ql supervisor 
/etc/supervisord.conf   			 ## 主配置文件
/etc/supervisord.d					 ##  主配置内包含的目录

编辑启动文件

[program:prometheus]                              ; 定义一个名为prometheus的进程组
directory=/app/prometheus/                        ; 指定Prometheus进程的工作目录
command=/bin/bash -c "/app/prometheus/prometheus" ; 指定启动Prometheus的命令,使用bash执行
autostart=true                                    ; 设置为true,表示Supervisor启动时自动启动此进程
autorestart=true                                  ; 设置为true,表示进程意外退出后自动重启
stdout_logfile=/var/log/prome_stdout.log          ; 指定标准输出日志文件的路径
stderr_logfile=/var/log/prome_stderr.log          ; 指定标准错误日志文件的路径
user=root                                         ; 指定以root用户身份运行此进程
stopsignal=TERM                                   ; 定义停止进程时发送的信号,这里使用TERM信号 kill -15
startsecs=5                                       ; 进程启动后,Supervisor等待5秒以确保其正常运行
startretries=3                                    ; 如果进程启动失败,Supervisor会尝试重新启动最多3次
stopasgroup=true                                  ; 在停止进程时,停止进程及其所有子进程
killasgroup=true                                  ; 在杀死进程时,发送信号到进程组的所有进程
##.编写Promethues启动脚本
[root@master01 ~]# vim /etc/supervisord.d/prome.ini
[program:prometheus]
directory=/app/prometheus/
command=/bin/bash -c "/app/prometheus/prometheus --config.file=/app/prometheus/prometheus.yml"
autostart=true
autorestart=true
stdout_logfile=/var/log/prome_stdout.log
stderr_logfile=/var/log/prome_stderr.log
user=root
stopsignal=TERM
startsecs=5
startretries=3
stopasgroup=true
killasgroup=true


[program:node]
directory=/app/node_exporter
command=/bin/bash -c "/app/node_exporter/node_exporter"
autostart=true
autorestart=true
stdout_logfile=/var/log/node_exporter_stdout.log
stderr_logfile=/var/log/node_exporter_stderr.log
user=root
stopsignal=TERM
startsecs=5
startretries=3
stopasgroup=true
killasgroup=true

[program:pushgateway]
directory=/app/pushgateway
command=/bin/bash -c "/app/pushgateway/pushgateway"
autostart=true
autorestart=true
stdout_logfile=/var/log/pushgateway_stdout.log
stderr_logfile=/var/log/pushgateway_stderr.log
user=root
stopsignal=TERM
startsecs=5
startretries=3
stopasgroup=true
killasgroup=true
#### 更新
[root@master alertmanager]# supervisorctl update
node: added process group
prometheus: added process group
pushgateway: added process group

### 加入后自动启动 因为这个选项autostart=true
[root@master alertmanager]# supervisorctl status
node                             RUNNING   pid 46914, uptime 0:01:07
prometheus                       RUNNING   pid 46915, uptime 0:01:07
pushgateway                      RUNNING   pid 46916, uptime 0:01:07

测试

[root@master alertmanager]# supervisorctl stop all
node: stopped
prometheus: stopped
pushgateway: stopped

web页面的测试

在配置文件当中添加如下内容 /etc/supervisord.conf
[inet_http_server]
port=0.0.0.0:6888
username=admin
password=123456

[root@master alertmanager]# supervisorctl  reload
Restarted supervisord

image-20240926173347220

浏览器访问: http://10.0.0.200:6888

image-20240926173432706

image-20240926173536480