掘金 后端 ( ) • 2024-04-07 16:25

Supervisor 是什么呢?

image.png

Supervisor 是一个用 Python 编写的进程管理工具,它被广泛用于 Linux 系统上管理和监控进程。它可以确保你的应用程序或服务在崩溃或服务器重启后自动重启,从而提高了系统的稳定性和可靠性。

快速开始

下面操作需要 root 权限,这里默认是使用 root 账号,如果当前不是 root 账号记得加 sudo

安装

yum install epel-release
yum install -y supervisor

启动

systemctl enable supervisord # 开机自启动
systemctl start supervisord # 启动supervisord服务

配置 supervisor

主配置在 /etc/supervisor/supervisord.conf 路径
子配置在 /etc/supervisord.d 路径
如果不是可以通过 cat /etc/supervisor/supervisord.conf 最后会指名子配置路径,当然也可以自己修改

[include]
files = supervisord.d/*.ini

配置模板

在编辑配置文件时一定要注意 ; 前后需要空格

;[program:HelloSupervisor] 是被管理的进程配置参数,HelloSupervisor 是进程的名称
[program:HelloSupervisor]
environment=JAVA_HOME=/opt/jdk1.8.0_241/bin  ; 这里可以创建环境变量
directory=/opt/HelloSupervisor ; 程序的启动目录
command=/opt/jdk1.8.0_241/bin/java -Xms512m -Xmx1024m -Dspring.profiles.active=prd -Dserver.port=8080 -jar /opt/HelloSupervisor/HelloSupervisor.jar ; 启动命令,可以看出与手动在命令行启动的命令是一样的
autostart=true       ; 在 supervisord 启动的时候也自动启动
startsecs=10         ; 启动 10 秒后没有异常退出,就表示进程正常启动了,默认为 1 秒
autorestart=true     ; 程序退出后自动重启 , 可选值:[unexpected,true,false],默认为 unexpected,表示进程意外杀死后才> 重启
startretries=3       ; 启动失败自动重试次数,默认是 3
user=root          ; 用哪个用户启动进程,默认是 root
priority=999         ; 进程启动优先级,默认 999,值小的优先启动
redirect_stderr=true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes=20MB  ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 20   ; stdout 日志文件备份数,默认是 10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/HelloSupervisor/logs/log.log
stopasgroup=false     ;默认为 false, 进程被杀死时,是否向这个进程组发送 stop 信号,包括子进程
killasgroup=false     ;默认为 false,向进程组发送 kill 信号,包括子进程
stopsignal=TERM      ; 杀死进程的信号量:kill -9:KILL; kill -2:INT; kill -15:TERM 默认配置

其他配置

stopscript=stop_script.sh ; 当进行停止的脚本
stopwaitsecs=10 ; 定义 Supervisor 等待进程停止的时间
command_stop=echo "Stopping process..." ; 定义在停止进程之前执行的命令
command_start=echo "Starting process..." ; 定义在启动进程之前执行的命令
command_restart=echo "Restarting process..." ; 定义在重启进程之前执行的命令
command_reload=echo "Reloading process..." ; 定义在重新加载进程之前执行的命令
numprocs=1 ; 定义要启动的进程实例数量
numprocs_start=1 ; 定义启动的进程实例的起始编号

配置完成后可以使用这个命令, 配置了 autostart=true 将会自动启动

supervisorctl update

常用命令

刷新配置

supervisorctl update 
supervisorctl reload # 可以避免手动停止和启动进程,而是通过重新加载配置来实现更改的生效,从而提高了操作的便利性和效率

区别:

  • update 命令用于在配置文件发生更改时启动新的进程,而 reload 命令用于重新加载配置文件并重新启动受影响的进程。
  • update 命令主要用于添加新的进程配置,而 reload 命令用于应用配置文件的更改,包括进程配置的修改、删除和其他配置的更新。
  • update 命令只启动新添加的进程,不会重新启动已经在运行的进程,而 reload 命令会重新启动受到更改影响的进程,使其应用新的配置
supervisorctl # 查看所有服务列表
supervisorctl start all # 启动全部服务
supervisorctl stop all # 停止全部服务
supervisorctl restart all # 重启全部服务

使用普通用户控制 supervisor

默认情况下只有 root 用户或者 sudo 的方式才可用使用,如果需要普通用户直接可以使用,可以按下面方式配置

假设普通用户名为:testuser

  • 步骤 1:使用root用户安装supervisor
  • 步骤 2:创建普通用户组
groupadd supervisor
usermod -a testuser -G supervisor
  • 步骤 3:修改以下配置文件
[testuser@4fff02d62bba ~]# vi /path/to/supervisord.conf
;修改下面路径
[unix_http_server]
file=/etc/supervisor/supervisor.sock   ; the path to the socket file
chmod=0766                 ; socket file mode (default 0700)
chown= testuser:supervisor     ; socket file uid:gid owner

下面步骤可选,如果需要普通用户完全控制 supervisord 需要下面操作

  • 步骤 4:删除默认路径下的: /etc/supervisord.conf
  • 步骤 5:使用普通用户启动 supervisord
supervisord -c  /path/to/supervisord.conf

进程分组

配置

需要在想要分组服务配置文件下新增分组配置

[group:test] ; 分组名称
programs=service1,servie2 ; 上面配置的 program 名称 即 program 后面的名称

进程分组命令

# 查看分组子服务列表
supervisorctl status group_name:
# 启动指定组名下服务
supervisorctl start group_name:
# 停止指定组名下服务
supervisorctl stop group_name:
# 重启指定组名下服务
supervisorctl restart group_name:

最后

如果想一起交流请加我微信号: -xiaou- 加后发送 技术群, 拉你进一个无广告无推销的技术交流群.

8d8f8312d0374b29be5ca1cfd777e9ae~tplv-k3u1fbpfcp-jj-mark_3024_0_0_0_q75 (1).jpg