supervisor 是一个 linux 进程管理工具,能确保关键进程持续运行并在崩溃时自动重启。1. 安装 supervisor:在 debian/ubuntu 上使用 apt,centos/rhel 上使用 yum;2. 创建配置文件定义进程,包括 command、user、autostart、autorestart 等参数;3. 更新配置使用 supervisorctl reread 与 update;4. 使用 supervisorctl 命令管理进程启停与状态查看;5. 设置开机自启动通过 systemctl 或 update-rc.d;6. startsecs 参数用于判定进程启动成功所需时间;7. 使用 [group:] 定义进程组可统一管理多个进程;8. 监控资源需结合 ps、top 或专业工具如 prometheus 实现。

Supervisor 是一个强大的进程管理工具,它能确保你的 Linux 系统上的关键进程持续运行,并在进程崩溃时自动重启。配置 Supervisor 的关键在于创建一个或多个配置文件,定义你要管理的进程,然后让 Supervisor 读取这些配置并启动、监控这些进程。

解决方案
-
安装 Supervisor:

在 Debian/Ubuntu 上:
sudo apt update sudo apt install supervisor
在 CentOS/RHEL 上:

sudo yum install epel-release # 如果没有 EPEL 仓库 sudo yum install supervisor
-
创建配置文件:
Supervisor 的配置文件通常位于
/etc/supervisor/conf.d/
目录下。为你的每个进程创建一个单独的配置文件,例如my_app.conf
。sudo nano /etc/supervisor/conf.d/my_app.conf
配置文件内容示例:
[program:my_app] command=/path/to/your/application ; 启动命令 user=your_user ; 运行用户 autostart=true ; Supervisor 启动时自动启动 autorestart=true ; 进程崩溃时自动重启 redirect_stderr=true ; 重定向标准错误输出 stdout_logfile=/var/log/my_app.log ; 标准输出日志文件
[program:my_app]
:定义进程名称,my_app
可以自定义。command
:进程的启动命令,替换为你的应用程序的实际路径。user
:运行进程的用户,建议使用非 root 用户。autostart
:设置为true
,使 Supervisor 在启动时自动启动该进程。autorestart
:设置为true
,使 Supervisor 在进程意外退出时自动重启它。redirect_stderr
:设置为true
,将标准错误输出重定向到日志文件。stdout_logfile
:指定标准输出的日志文件路径。
-
更新 Supervisor 配置:
创建或修改配置文件后,需要让 Supervisor 重新加载配置。
sudo supervisorctl reread sudo supervisorctl update
reread
:重新读取所有配置文件。update
:根据新的配置启动或停止进程。
-
启动、停止和重启进程:
使用
supervisorctl
命令管理进程。sudo supervisorctl start my_app ; 启动 my_app 进程 sudo supervisorctl stop my_app ; 停止 my_app 进程 sudo supervisorctl restart my_app ; 重启 my_app 进程 sudo supervisorctl status my_app ; 查看 my_app 进程状态 sudo supervisorctl status ; 查看所有进程状态
-
开机自启动 Supervisor:
Supervisor 通常会自动配置为开机自启动。如果没有,可以使用以下命令手动配置:
在 systemd 系统上 (例如 Ubuntu 16.04+, CentOS 7+):
sudo systemctl enable supervisor
在 SysVinit 系统上 (较旧的 Linux 发行版):
sudo update-rc.d supervisor defaults
Supervisor 配置文件中的 startsecs
参数有什么用?
startsecs参数定义了进程在启动后被 Supervisor 认为“成功启动”所需的时间(秒)。如果进程在
startsecs秒内退出,Supervisor 会认为启动失败,并根据
autorestart设置进行处理(通常是重启)。这个参数对于那些启动需要一些时间的服务非常有用,可以避免 Supervisor 误判进程启动失败而频繁重启。 默认值是 1 秒,但对于启动缓慢的应用程序,可能需要调整到 5 秒甚至更长。
如何使用 Supervisor 管理多个进程组?
Supervisor 支持进程组的概念,允许你同时管理多个相关的进程。你可以在配置文件中使用
[group:group_name]来定义一个进程组,然后将多个进程添加到该组中。
例如:
[group:web_app] programs=my_app, celery_worker [program:my_app] command=/path/to/your/web_app user=www-data autostart=true autorestart=true [program:celery_worker] command=/path/to/your/celery_worker user=www-data autostart=true autorestart=true
然后,你可以使用
supervisorctl命令来管理整个进程组:
sudo supervisorctl start web_app:* ; 启动 web_app 组中的所有进程 sudo supervisorctl stop web_app:* ; 停止 web_app 组中的所有进程 sudo supervisorctl restart web_app:* ; 重启 web_app 组中的所有进程 sudo supervisorctl status web_app:* ; 查看 web_app 组中所有进程的状态
注意,
web_app:*中的
*是通配符,表示该组中的所有进程。
如何监控 Supervisor 管理的进程的 CPU 和内存使用情况?
Supervisor 本身不提供直接的 CPU 和内存监控功能。但是,你可以结合其他工具来实现这个目标。一个常见的方法是使用
ps命令结合
awk或
top命令来获取进程的 CPU 和内存使用情况,然后将这些信息记录到日志文件中。
例如,你可以创建一个脚本,定期运行以下命令,并将结果写入日志文件:
#!/bin/bash process_name="my_app" # 替换为你的进程名称 pid=$(pidof $process_name) if [ -n "$pid" ]; then cpu_usage=$(ps -p $pid -o %cpu | tail -n 1) mem_usage=$(ps -p $pid -o %mem | tail -n 1) echo "$(date) - CPU: $cpu_usage%, Memory: $mem_usage%" >> /var/log/my_app_resource.log else echo "$(date) - Process '$process_name' not found." >> /var/log/my_app_resource.log fi
然后,你可以使用 Supervisor 来管理这个监控脚本,并设置定期执行。 另一种选择是使用更专业的监控工具,例如 Prometheus 或 Grafana,它们可以提供更全面的监控指标和可视化界面。 你需要配置这些工具来收集 Supervisor 管理的进程的指标,并将数据展示出来。 具体的配置方法取决于你选择的监控工具。










