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- 加后发送 技术群, 拉你进一个无广告无推销的技术交流群.