Linux 后台服务管理之 Supervisor

在日常开发和部署中,我们常常需要将一些后台程序(如自定义脚本、Web 服务、定时任务等)以守护进程的方式稳定运行在服务器上。为了方便地启动、停止、重启并监控这些进程,推荐使用控制程序 Supervisor —— 一个强大、轻量的进程管理工具。

一、什么是 Supervisor?

Supervisor 是一个使用 Python 开发的进程管理工具,它可以将普通的非守护进程以服务形式管理。你可以通过命令行或 Web 界面控制这些程序,常用于守护和管理自己写的服务。

使用场景

  • Flask、FastAPI、Django Web 服务
  • Celery、RQ 等异步任务队列
  • Node.js 或 Go 编写的 API 服务
  • 各类后台脚本、爬虫、数据处理服务

功能概述

  • 启动/停止/重启服务
  • 监控服务运行状态
  • 异常退出自动重启
  • 日志记录和输出重定向
  • 提供命令行和 Web UI 控制面板
  • 支持多服务统一管理

二、安装 Supervisor

Supervisor 支持多种安装方式,适用于 Python 虚拟环境、系统级包管理器等。

方式一:使用 pip 安装

pip install supervisor

安装完成后会自动提供一个命令行工具 echo_supervisord_conf 来生成默认配置。

方式二:使用系统包管理器

# Debian / Ubuntu
sudo apt install supervisor

# CentOS / Rocky Linux
sudo yum install supervisor

安装后会自动注册 systemd 服务,并创建默认目录 /etc/supervisor/

三、Supervisor 配置结构

Supervisor 通常由两个配置层组成:

  • 主配置文件(``/etc/supervisor/supervisord.conf`):控制 Supervisor 自身运行
  • 程序配置文件(``/etc/supervisor/conf.d/*.conf`):定义具体服务程序

1. 生成默认配置(pip 安装时)

echo_supervisord_conf > /etc/supervisord.conf

可根据需要修改其 include 部分来引用子配置:

[include] files = /etc/supervisor/conf.d/*.conf

2. 示例服务配置文件 /etc/supervisor/conf.d/myapp.conf

[program:myapp]
command=/usr/bin/python3 /path/to/app.py  ; 启动命令
directory=/path/to                        ; 工作目录
autostart=true                            ; 随 supervisord 启动自动运行
autorestart=true                          ; 异常退出后自动重启
stderr_logfile=/var/log/myapp.err.log     ; 错误日志
stdout_logfile=/var/log/myapp.out.log     ; 标准输出日志
user=nobody                               ; 运行该进程的用户

常用字段说明:

配置项 说明
command 启动命令
directory 程序工作目录
autostart Supervisor 启动时自动启动该程序
autorestart 程序退出后是否自动重启
user 以哪个用户身份运行程序
stdout_logfile 标准输出日志路径
stderr_logfile 标准错误日志路径(可用 redirect_stderr

四、Supervisor 常用命令

启动 Supervisor 本身

# 如果使用 pip 安装:
supervisord -c /etc/supervisord.conf

# 如果使用系统安装:
sudo systemctl start supervisor

管理受管服务

# 查看所有程序状态
supervisorctl status

# 启动 / 停止 / 重启 某个程序
supervisorctl start myapp
supervisorctl stop myapp
supervisorctl restart myapp

# 重新读取配置(修改配置后需执行)
supervisorctl reread     # 检查新的配置文件
supervisorctl update     # 加载新的配置文件

# 重新加载所有配置(重启所有受管服务)
supervisorctl reload

五、启用 Web 管理界面

Supervisor 还提供了一个简易的 Web UI 控制面板。你可以在 supervisord.conf 中启用如下配置:

[inet_http_server]
port=*:9001           ; 或 127.0.0.1:9001
username=admin        ; 登录用户名
password=123456       ; 登录密码

然后重启 Supervisor 后,访问浏览器打开http://服务器IP:9001,即可通过 Web 页面管理所有受管进程。

Supervisor控制台

六、简单案例:部署 Flask 服务

假设你有一个 app.py 的 Flask 程序:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return "Hello, Supervisor!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=8080)

创建 Supervisor 配置文件 /etc/supervisor/conf.d/flask.conf

[program:flask]
command=python3 /home/ubuntu/app.py
directory=/home/ubuntu
autostart=true
autorestart=true
stdout_logfile=/var/log/flask.log
redirect_stderr=true

然后:

# 检查新的配置文件 返回 flask: available
supervisorctl reread

# 加载新的配置文件 返回 flask: added process group
supervisorctl update

# 启动flask应用 返回 flask: started
supervisorctl start flask

现在你就有一个稳定运行的 Flask 服务了!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容