Supervisor 是什么呢?

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 路径 <br/>

子配置在 /etc/supervisord.d 路径 <br/>

如果不是可以通过 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- 加后发送 技术群, 拉你进一个无广告无推销的技术交流群.