在CentOS 7服务器上,管理和维护长时间运行的后台进程是一项常见但至关重要的任务,这些进程可能是Web应用、队列处理器、数据同步服务或其他任何需要持续运行的守护进程,当进程意外崩溃时,手动重启不仅效率低下,而且可能导致服务中断,为了解决这个问题,Supervisor应运而生,它是一个用Python编写的客户端/服务器系统,允许用户监控和控制类UNIX操作系统上的多个进程,本文将详细介绍如何在CentOS 7系统上安装、配置和使用Supervisor,以确保您的关键服务能够稳定、自动地运行。

安装前准备
在开始安装Supervisor之前,确保您的系统满足以下基本条件,这将为后续的安装和配置过程铺平道路。
您需要一个拥有sudo权限的非root用户,这是执行系统管理命令的最佳实践,可以避免因误操作对系统造成不可逆的损害,如果您尚未创建此类用户,请先完成创建。
保持系统软件包的最新状态是一个好习惯,这可以修复已知的安全漏洞并解决潜在的软件依赖冲突,执行以下命令来更新您的CentOS 7系统:
sudo yum update -y
Supervisor并不包含在CentOS 7的默认软件源中,它位于EPEL(Extra Packages for Enterprise Linux)仓库里,EPEL是一个由Fedora项目维护的,为企业级Linux提供高质量软件包的社区仓库,我们需要先安装EPEL仓库:
sudo yum install -y epel-release
完成以上准备步骤后,您的系统就已经准备好安装Supervisor了。
安装并启用Supervisor
安装过程非常直接,EPEL仓库启用后,我们可以使用yum包管理器轻松安装Supervisor。
执行以下命令进行安装:
sudo yum install -y supervisor
安装完成后,您可以通过以下命令验证Supervisor是否已成功安装并查看其版本号:
supervisord --version
我们需要将Supervisor服务设置为开机自启,并立即启动它,这可以通过systemctl命令完成,它是CentOS 7及以后版本中管理服务的标准工具。
# 设置Supervisor开机自启 sudo systemctl enable supervisord # 立即启动Supervisor服务 sudo systemctl start supervisord
为了确认Supervisor服务正在正常运行,可以检查其状态:
sudo systemctl status supervisord
如果输出中显示active (running),则表示Supervisor已成功启动并在后台运行。
配置Supervisor管理应用
Supervisor的核心功能在于其配置,主配置文件位于/etc/supervisord.conf,虽然可以直接修改此文件来添加要管理的进程,但更推荐的做法是利用其[include]模块,将不同应用的配置分散到独立的文件中,这样做的好处是配置清晰、易于管理和维护。

在/etc/supervisord.conf文件的末尾,您会看到如下配置:
[include] files = supervisord.d/*.ini
这行配置告诉Supervisor,除了加载主配置文件外,还要加载/etc/supervisord.d/目录下所有以.ini结尾的配置文件,我们只需为每个需要管理的应用创建一个对应的.ini文件即可。
创建一个示例应用配置
假设我们有一个简单的Python应用my_app.py,我们希望用Supervisor来管理它,创建这个Python脚本:
# 创建一个目录存放应用 mkdir -p /opt/myapp # 创建并编辑应用脚本 vi /opt/myapp/my_app.py
在my_app.py中写入以下内容,这是一个每隔5秒打印一次当前时间的简单脚本:
import time
import datetime
while True:
print(f"Current time: {datetime.datetime.now()}")
time.sleep(5) 为这个应用创建Supervisor配置文件:
sudo vi /etc/supervisord.d/myapp.ini
在myapp.ini文件中添加以下内容:
[program:myapp] command=python3 /opt/myapp/my_app.py directory=/opt/myapp autostart=true autorestart=true stderr_logfile=/var/log/myapp.err.log stdout_logfile=/var/log/myapp.out.log user=root
下表解释了这些关键配置项的含义:
| 配置项 | 含义说明 |
|---|---|
[program:myapp] | | 定义一个名为myapp的程序。 |
command | 启动进程的完整命令。 |
directory | 执行command前切换到的工作目录。 |
autostart=true | 在Supervisor启动时,自动启动此程序。 |
autorestart=true | 当程序异常退出时,Supervisor会自动重启它。 |
stderr_logfile | 标准错误输出日志文件的路径。 |
stdout_logfile | 标准输出日志文件的路径。 |
user | 以哪个用户身份运行此程序。 |
配置文件创建好后,需要通知Supervisor加载新的配置,使用supervisorctl命令:
# 重新加载配置并启动/更新有变化的进程 sudo supervisorctl update
您可以检查myapp的状态了:
sudo supervisorctl status myapp
您应该会看到myapp的状态为RUNNING,可以查看其输出日志:
tail -f /var/log/myapp.out.log
管理进程与启用Web界面
supervisorctl是与Supervisor交互的主要命令行工具,除了status和update,还有一些常用命令:

sudo supervisorctl stop <program_name>: 停止指定的进程。sudo supervisorctl start <program_name>: 启动指定的进程。sudo supervisorctl restart <program_name>: 重启指定的进程。sudo supervisorctl reread: 仅重新读取配置文件,不应用更改,通常与update配合使用。
Supervisor还提供了一个基于Web的图形化管理界面,非常方便,要启用它,需要修改主配置文件/etc/supervisord.conf。
找到[inet_http_server]部分,默认情况下它是被注释掉的,取消注释并根据需要进行修改:
[inet_http_server] port=*:9001 username=admin password=your_secure_password
这里,我们将Web服务器监听在所有网卡的9001端口,并设置了用户名和密码,请务必将your_secure_password替换为一个强密码。
修改后,重启Supervisor服务以使更改生效:
sudo systemctl restart supervisord
如果您的服务器启用了防火墙(强烈建议),需要开放9001端口:
sudo firewall-cmd --permanent --add-port=9001/tcp sudo firewall-cmd --reload
您可以在浏览器中访问 http://<your_server_ip>:9001,输入您设置的用户名和密码,即可通过Web界面直观地管理所有进程。
相关问答FAQs
问题1:我修改了.ini配置文件,为什么我的应用没有按照新配置运行?
解答: 这是一个常见的误区,仅仅修改或创建了.ini文件,Supervisor并不会自动感知到这些变化,您必须明确地通知Supervisor重新读取并应用新的配置,正确的操作流程是执行sudo supervisorctl update,这个命令会做两件事:首先执行reread来检查配置文件的变化,然后应用这些变化(启动新添加的程序或重启配置已更改的程序),忘记执行update是导致配置不生效的最主要原因。
问题2:我的进程在Supervisor中一直显示BACKOFF状态,这是什么意思,该如何解决?
解答: BACKOFF状态表示Supervisor尝试启动您的进程,但进程在启动后很快就退出了,Supervisor会认为这是一个“启动失败”,为了避免在短时间内频繁重启一个持续失败的服务,它会进入一个“退避”阶段,即等待一段时间后再尝试重启,解决这个问题的关键在于找出进程为什么会快速退出,您应该立即检查该进程的日志文件,特别是错误日志(stderr_logfile)和标准输出日志(stdout_logfile),这些文件里通常会记录导致程序崩溃或退出的具体错误信息,根据日志中的错误提示(如端口被占用、配置文件错误、依赖缺失等),修复根本问题后,进程通常就能正常启动了。
【版权声明】:本站所有内容均来自网络,若无意侵犯到您的权利,请及时与我们联系将尽快删除相关内容!
发表回复