1. Supervisor 是什么?
一句话概括:
Supervisor 是一个用 Python 编写的进程管理工具,它可以帮助你在类 Unix 系统(如 Linux、macOS)上监控、控制和管理多个长期运行的进程。
它解决了什么问题?
想象一下,你有一个或多个需要长时间运行的后台进程(例如,一个用 Python 写的 Web 应用、一个 Node.js 的 API 服务、一个自定义的脚本等)。你可能会遇到以下问题:
- 进程意外退出:程序因为 bug 或异常而崩溃,你需要手动去重启它。
- 开机自启动:服务器重启后,你需要手动重新启动所有这些服务,非常麻烦。
- 管理不便:没有统一的界面来查看所有进程的状态、日志,以及集中管理(启动、停止、重启)。
Supervisor 就是为解决这些问题而生的。
2. 核心功能:
- 进程监控:Supervisor 启动后,它会负责启动你所配置的进程,并监控它们的状态。
- 自动重启:当管理的进程意外退出时,Supervisor 可以自动重启它,确保服务高可用。
- 统一管理:提供了一个统一的命令行工具和 Web 界面来管理所有进程(启动、停止、重启、查看状态)。
- 日志集中管理:可以捕获和管理进程的标准输出和错误输出,方便排查问题。
- 进程组:可以将进程分组管理,方便对一组服务进行批量操作。
3. 如何使用 Supervisor?
使用 Supervisor 通常分为四个步骤:安装、配置、启动和管理。
步骤一:安装
在大多数 Linux 发行版上,可以使用包管理器轻松安装。
在 Ubuntu/Debian 上:
sudo apt-get update
sudo apt-get install supervisor
在 CentOS/RHEL 上:
sudo yum install supervisor
# 或者对于较新版本
sudo dnf install supervisor
使用 Pip 安装(适用于所有平台):
pip install supervisor
安装完成后,Supervisor 服务通常会自动启动。
步骤二:配置
Supervisor 的主配置文件是 /etc/supervisor/supervisord.conf。通常,我们不需要直接修改这个文件,而是将每个需要管理的进程的配置文件放在 /etc/supervisor/conf.d/ 目录下,文件以 .conf 结尾。
最佳实践:一个进程一个配置文件。
让我们来创建一个示例配置文件。假设我们有一个简单的 Python Web 应用,使用 Flask 编写,它的启动命令是 python /path/to/your/app.py。
- 创建配置文件:
sudo nano /etc/supervisor/conf.d/my_flask_app.conf
- 编辑配置文件内容:
[program:my_flask_app] ; 程序唯一名称,用于管理
command=python /path/to/your/app.py ; 需要 Supervisor 执行的命令
directory=/path/to/your/ ; 执行命令前先切换到这个目录
autostart=true ; 在 Supervisor 启动时自动启动该程序
autorestart=true ; 程序退出后自动重启,可选值为 false, unexpected, true
startretries=3 ; 启动失败后的重试次数
user=www-data ; 使用哪个用户来运行该进程(例如,如果和 Web 服务器相关)
stdout_logfile=/var/log/my_flask_app.out.log ; 标准输出日志文件路径
stderr_logfile=/var/log/my_flask_app.err.log ; 标准错误输出日志文件路径
environment=HOME="/home/username",USER="username" ; 设置环境变量
- 关键配置项说明:
- [program:xxx]:定义一个程序。
- command:最重要的配置,就是你平时在命令行里启动程序的命令。
- autorestart:
- true:只要退出就重启。
- unexpected:只有在意外的退出码(非 0 或程序特定的 exitcode)时才重启。这是最常用的选项。
- false:不自动重启。
- stdout_logfile / stderr_logfile:务必配置日志,这是排查问题的关键。
步骤三:启动与重载配置
- 让 Supervisor 读取新的配置:
创建或修改配置文件后,你需要告诉 Supervisor 重新加载配置。
sudo supervisorctl reread
这个命令会扫描配置目录,如果输出类似 my_flask_app: available,说明配置被正确识别。
- 将新配置的程序加入到进程组:
sudo supervisorctl update
这个命令会将 available 的程序变为 active,并根据 autostart 设置自动启动它们。
步骤四:管理进程(常用命令)
使用 supervisorctl 命令来管理进程。
- 查看所有进程状态:
sudo supervisorctl status
输出示例:
my_flask_app RUNNING pid 12345, uptime 0:10:00
- 启动一个进程:
sudo supervisorctl start my_flask_app
- 停止一个进程:
sudo supervisorctl stop my_flask_app
- 重启一个进程:
sudo supervisorctl restart my_flask_app
- 重启所有进程:
sudo supervisorctl restart all
- 重新加载配置文件并重启有变化的程序(常用组合技):
sudo supervisorctl reread && sudo supervisorctl update
- 查看进程的实时日志:
sudo supervisorctl tail -f my_flask_app stdout
sudo supervisorctl tail -f my_flask_app stderr
- 进入 supervisorctl 交互式 Shell:
直接输入 sudo supervisorctl,会进入一个提示符,然后可以直接输入 status, start xxx 等命令。
supervisor> status
supervisor> stop my_flask_app
supervisor> exit
4. Web 管理界面(可选)
Supervisor 还提供了一个简单的 Web 界面,可以方便地查看状态和进行基本操作。要启用它,需要编辑主配置文件 /etc/supervisor/supervisord.conf。
找到 [inet_http_server] 部分,取消注释并修改:
[inet_http_server]
port=*:9001 ; Web 界面端口,* 表示监听所有 IP
username=your_username ; 登录用户名(自定义)
password=your_password ; 登录密码(自定义)
然后重启 Supervisor 服务:
sudo systemctl restart supervisor
# 或者 sudo service supervisor restart
之后就可以通过浏览器访问 http://your_server_ip:9001 来使用 Web 界面了。
5. 总结
Supervisor 是一个强大而简单的工具,它能极大地简化服务器上后台进程的运维工作。其核心使用流程就是:
- 安装:
apt-get install supervisor - 配置:在
/etc/supervisor/conf.d/下为每个进程创建一个 .conf 文件。 - 加载:使用
sudo supervisorctl reread && sudo supervisorctl update使配置生效。 - 管理:使用
sudo supervisorctl [start|stop|restart|status] [program_name]进行日常管理。
对于任何需要保证 7x24 小时运行的服务,Supervisor 都是一个非常值得推荐的选择。
浙公网安备 33010602011771号