进程管理备忘录(supervisor)

news/2025/2/11 12:32:21/文章来源:https://www.cnblogs.com/mugetsukun/p/18702129

Supervisor 核心价值

  1. 进程保活:异常退出自动重启
  2. 日志管理:集中收集与轮转切割
  3. 服务编排:多进程启停顺序控制
  4. 权限隔离:以指定用户身份运行
  5. 状态监控:提供Web/CLI监控界面

一、基础配置

1. 最小化配置

[program:webapp]
command=/opt/app/bin/gunicorn -w 4 app:app
directory=/opt/app
user=appuser
autostart=true
autorestart=unexpected
stopsignal=TERM
stdout_logfile=/var/log/webapp.log
redirect_stderr=true

参数解析

  • autorestart=unexpected:仅在非正常退出时重启
  • stopsignal=TERM:优雅终止信号
  • redirect_stderr:错误输出合并到stdout

2. 进程分组管理

[group:microservices]
programs=svc1,svc2,svc3
priority=999

操作命令

supervisorctl start microservices:
supervisorctl stop microservices:*

二、生产环境实践

3. 优雅关闭配合

[program:celery]
command=/opt/app/bin/celery -A tasks worker
stopwaitsecs=300
killasgroup=true
stopasgroup=true

关键参数

  • stopwaitsecs:等待进程自行退出的超时时间
  • killasgroup:向整个进程组发送信号

4. 日志轮转配置

[program:task_processor]
stdout_logfile=/var/log/task.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=0

日志维护策略

  • 最多保留10份日志
  • 单文件上限100MB
  • 禁用日志内存缓冲

三、高级应用场景

5. 动态环境变量

[program:api_server]
command=/opt/app/start.sh
environment=
NODE_ENV="prod",
REDIS_HOST="%(ENV_REDIS_HOST)s",
SECRET_KEY="%(ENV_API_KEY)s"

启动命令

ENV_REDIS_HOST=10.0.0.5 ENV_API_KEY=xxxx supervisord

6. 多进程启动顺序

[program:init_db]
command=/opt/app/bin/init_db.sh
priority=100
autorestart=false[program:main_app]
command=/opt/app/bin/start_app.sh
priority=200
startsecs=30
startretries=3
depends_on=init_db

启动顺序控制

  1. 先执行 init_db (priority 值小优先)
  2. 主应用监测 init_db 完成才开始

7. 容器化部署方案

# supervisor.conf
[supervisord]
nodaemon=true
logfile=/dev/stdout
logfile_maxbytes=0[program:app]
command=python /app/main.py
stdout_logfile=/dev/fd/1
stdout_logfile_maxbytes=0
redirect_stderr=true

容器操作

CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor.conf"]

四、安全强化配置

8. Web控制台安全

[inet_http_server]
port=10.0.0.1:9001
username=admin
password=sha1:7b4d4a5b5e7a:9933d6ddf7a9d1add043a9482a9f1082e929d3c

密码生成

echo 'mypassword' | openssl sha1

9. 文件权限隔离

[program:sensitive_job]
user=isolated
umask=0077
directory=/opt/secure

防御策略

  • 专用低权限用户运行
  • 目录权限 700
  • 日志独立存储

五、维护与排错

10. 信号与状态解读

信号 用途 示例命令
SIGHUP 重载配置 supervisorctl reload
SIGTERM 正常关闭 supervisorctl shutdown
SIGQUIT 强制关闭 kill -QUIT pid

进程状态表

状态 含义 处理措施
FATAL 配置错误 检查日志/配置文件
BACKOFF 频繁重启 查看进程退出代码
STOPPED 手动停止 检查依赖项

11. 僵尸进程处理

supervisorctl stop all
ps -ef | grep defunct | awk '{print $3}' | xargs kill -9
supervisorctl start all

六、企业级监控指标

Prometheus Exporter 配置

[program:supervisor_exporter]
command=/opt/exporter/supervisor_exporter --telemetry.addr=:9002
autostart=true

关键监控项

  • supervisor_process_status 进程状态 (0=RUNNING)
  • supervisor_restart_count 进程重启次数
  • supervisor_up Supervisor自身健康状态

七、性能调优指南

12. 内存限制防护

[program:memory_intensive]
command=/opt/app/bigdata_processor
stopasgroup=true
killasgroup=true
environment=MEMORY_LIMIT="80%"

配套监控脚本

#!/bin/bash
if [[ $(ps -o rss= $(cat /var/run/app.pid)) -gt 8000000 ]]; then
supervisorctl restart memory_intensive
fi

八、与Systemd对比实践

Supervisor vs Systemd 选型矩阵

需求场景 Supervisor Systemd
进程日志管理 ✔️ 自动收集 需单独配置
多进程依赖管理 ✔️ 灵活编排 需多个unit文件
非root启动进程 ✔️ 原生支持 需用户服务文件
系统级服务 ❌ 不适合 ✔️ 首选方案
Docker容器内 ✔️ 轻量管理 ❌ 过于臃肿

九、灾难恢复演练

场景:服务进程陷入死循环

1. # 查看异常进程supervisorctl status2. # 优雅重启supervisorctl restart app3. # 强制停止supervisorctl stop appkill -9 $(ps -ef | grep app | grep -v grep | awk '{print $2}')4. # 回滚版本rsync -av /backup/app_v1/ /opt/app/5. # 重新启动supervisorctl start app

十、注意事项

  1. 权限控制
  • 禁止使用root运行业务进程
  • Log目录设置 chmod 700 /var/log/supervisor
  1. 资源限制
[program:workers]
minfds=65535# 文件描述符限制
minprocs=20000 # 进程数限制
  1. 不要使用场景
  • 需要依赖系统启动顺序的服务
  • 必须保证单实例的系统核心组件
  • 需要cgroups隔离的资源管理

实践

实践示例:使用 Supervisor 管理一个 Flask 应用

步骤 1:安装 Supervisor

sudo apt-get update
sudo apt-get install -y supervisor

步骤 2:创建 Flask 应用

/opt/myapp 目录下创建一个简单的 Flask 应用:

# app.py
from flask import Flask
app = Flask(__name__)@app.route('/')
def home():return "Hello, Supervisor!"

步骤 3:配置 Supervisor

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

[program:myapp]
command=/usr/bin/python3 /opt/myapp/app.py
directory=/opt/myapp
user=myuser
autostart=true
autorestart=true
stdout_logfile=/var/log/myapp.log
redirect_stderr=true

步骤 4:重新加载 Supervisor 配置

sudo supervisorctl reload

步骤 5:启动服务

sudo supervisorctl start myapp

步骤 6:验证服务状态

sudo supervisorctl status myapp

步骤 7:访问应用

在浏览器中访问 http://localhost:5000,应看到 "Hello, Supervisor!"。

步骤 8:停止服务

sudo supervisorctl stop myapp

步骤 9:重启服务

sudo supervisorctl restart myapp

步骤 10:查看日志

tail -f /var/log/myapp.log

实践示例:使用 Supervisor 管理 Celery 任务队列

步骤 1:安装 Celery 和 Supervisor

sudo apt-get update
sudo apt-get install -y supervisor
pip3 install celery

步骤 2:创建 Celery 任务

/opt/celery 目录下创建任务文件 tasks.py

from celery import Celeryapp = Celery('tasks', broker='redis://localhost:6379/0')@app.task
def add(x, y):return x + y

步骤 3:配置 Supervisor

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

[program:celery]
command=/usr/bin/celery -A tasks worker --loglevel=INFO
directory=/opt/celery
user=celeryuser
autostart=true
autorestart=unexpected
stdout_logfile=/var/log/celery.log
redirect_stderr=true

步骤 4:重新加载 Supervisor 配置

sudo supervisorctl reload

步骤 5:启动 Celery 服务

sudo supervisorctl start celery

步骤 6:验证服务状态

sudo supervisorctl status celery

步骤 7:测试任务

celery -A tasks call add 4 5

步骤 8:停止服务

sudo supervisorctl stop celery

步骤 9:重启服务

sudo supervisorctl restart celery

步骤 10:查看日志

tail -f /var/log/celery.log

实践示例:使用 Supervisor 管理 Nginx 和 Gunicorn

步骤 1:安装 Nginx 和 Gunicorn

sudo apt-get update
sudo apt-get install -y nginx python3-gunicorn supervisor

步骤 2:创建 Flask 应用

/opt/webapp 目录下创建 app.py

from flask import Flask
app = Flask(__name__)@app.route('/')
def home():return "Hello, Supervisor!"

步骤 3:配置 Gunicorn

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

[program:webapp]
command=/usr/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app
directory=/opt/webapp
user=webuser
autostart=true
autorestart=unexpected
stdout_logfile=/var/log/webapp.log
redirect_stderr=true

步骤 4:配置 Nginx

创建 Nginx 配置文件 /etc/nginx/sites-available/webapp

server {listen 80;server_name localhost;location / {proxy_pass http://localhost:8000;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;}
}

启用配置并重启 Nginx:

sudo ln -s /etc/nginx/sites-available/webapp /etc/nginx/sites-enabled/
sudo systemctl restart nginx

步骤 5:重新加载 Supervisor 配置

sudo supervisorctl reload

步骤 6:启动服务

sudo supervisorctl start webapp

步骤 7:验证服务状态

sudo supervisorctl status webapp

步骤 8:访问应用

在浏览器中访问 http://localhost,应看到 "Hello, Supervisor!"。

步骤 9:停止服务

sudo supervisorctl stop webapp

步骤 10:重启服务

sudo supervisorctl restart webapp

步骤 11:查看日志

tail -f /var/log/webapp.log

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/882046.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql 系统变量

前言 简单介绍一下mysql的系统变量 正文 当我们之间查看mysql的系统变量的时候呢? 我们使用show variables,这样我们就可以查看到系统变量。 但是这样显然是没有意义的。可以看到很多很多的系统变量,如果想查具体的,那么就是: SHOW VARIABLES LIKE default_storage_engine又…

批量PDF文件转Word,免费!

今天推荐一款免费的PDF文件转换工具,它包括了PDF压缩、PDF转Word、PDF转Excel、提取PDF中图片等功能,下载地址在文末。 操作步骤 1、打开PDF转换工具,点击菜单PDF转Word,如下图2、添加需要转换的PDF文件,支持批量添加多个文件一起进行转换,如果一个目录下面的所有文件都需…

【博主亲测可用】科学计算软件:Wolfram Mathematica 14.2.0(附软件包及安装教程)

软件介绍 Wolfram Mathematica 14.2.0是一款功能全面且强大的数学计算与分析软件,它在大数据处理、人工智能集成、符号数组功能扩展、图形和可视化改进以及性能提升方面都有显著的增强。这些改进不仅使用户能够更高效地进行数据分析和科学计算,还极大地提升了用户体验。无论是…

硅基流动

使用硅基流动+Cherry ai部署 硅基流动网站:https://cloud.siliconflow.cn/i/OIItglHJ 邀请码:OIItglHJ 首次注册免费2000万Tokens Cherry ai网站:https://cherry-ai.com/download第一步,登入硅基流动网站,注册后 在左边选择api密钥,右上角选择新建api密钥新建后点击密钥…

Windows系统安装Ollama超简教程(附DeepSeek R1实战)

一、Ollama下载指引 官网地址:https://ollama.com/download选择Windows版本直接下载(推荐64位系统),安装包745MB左右,支持Win10/11系统。点击"Download for Windows"按钮即可开始下载。 二、安装过程详解双击下载的OllamaSetup.exe点击install之后,一路下一步就…

部署milvus2.5.3(standalone模式)

环境:os:Centos 7milvus:2.5.31.创建部署目录mkdir -p /home/middle/milvus2.准备docker-compose.yml配置文件内如如下: 我这里使用的是自己的镜像,需要根据自己环境情况进行修改[root@host135 milvus]# more docker-compose.yml version: 3.5services:etcd:container_name: m…

[书]清华大学DeepSeek:从入门到精通

通过网盘分享的文件:清华大学DeepSeek:从入门到精通.pdf等3个文件链接: https://pan.baidu.com/s/1y0-b3seTz7gMTTuPxYS7Vg?pwd=xd25 提取码: xd25一共三本资料

六. UML

UML 一. 事物 1.结构事物 结构事物是UML模型中的名词。它们通常是模型的静态部分,描述概念或物理元素。结构事物包括类(Class)、接口(Interface)、协作(Collaboration)、用例(Use Case)、主动类(Active Class)、构件(Component)、制品( Artifact)和结点(Node)。 各种结构事物的…

探索 QuestPDF:全平台支持、多功能、专业级的 .NET PDF 库

QuestPDF 是一个用于生成 PDF 文件的 .NET 库,它提供了一个简洁的 API 和灵活的布局选项,使得在 .NET 应用程序中创建 PDF 文件变得更加简单。 支持多平台,支持的功能有合并文档 附加文件 提取页面 加密/解密 扩展元数据 限制访问 针对 Web 进行优化 叠加层 / 底层安装 第一…

Java 中堆内存和栈内存上的数据分布和特点

说到 Java 中内存我们一般笼统地划分为堆内存(Heap)和栈内存(Stack),那么哪些数据被放置在堆内存?哪些数据被放置在栈内存?这些数据的分布有什么特点吗?博客:https://www.emanjusaka.com 博客园:https://www.cnblogs.com/emanjusaka 公众号:emanjusaka的编程栈by em…

AspNetCore 实战:三种流式响应机制详解

在现代Web应用中,实时数据传输和高效的数据流处理变得越来越重要。AspNetCore 提供了多种流式响应机制,以满足不同场景下的需求。 在使用ChatGpt,deepseek的适合有没有想过ai的逐字显示回答是怎么实现的,下面将介绍三种主要的流式响应来实现此功能。 Server-Sent Events (S…

java中反射-字节码和类加载器

多态的一个表现 子类类型赋值给父类 Father f1 = New Son() 调用子类方法报错。 调用父类方法OK。这个就是多态 一个对象能用什么方法,并不是取决于 它有什么方法。 而是取决于引用变量的类型(也就是取决于它声明的类型,Father类型) 它能够用的方法,一定是Father中的方法。 …