【开发工具】好用的进程管理工具supervisor

supervisor配置与使用

    • 概述
    • 配置文件详解
    • 其他高级用法
    • 相关文献

概述

Supervisor是一个用Python编写的进程管理工具,主要用于在类Unix系统中管理和监控长时间运行的进程。以下是对它的详细介绍:

一、功能特点

  1. 进程监控
    • Supervisor可以自动启动、停止和重启进程。当被管理的进程意外退出时,它能够自动重新启动该进程,确保服务的连续性。例如,如果你有一个Web服务器进程(如Gunicorn),如果由于某种原因(如内存不足导致的段错误)崩溃,Supervisor会检测到并立即重新启动它,减少服务中断的时间。
  2. 日志管理
    • 它会捕获被管理进程的标准输出(stdout)和标准错误(stderr),并将这些输出记录到日志文件中。这对于调试程序非常有用,因为你可以通过查看日志来了解进程的运行状态和可能出现的错误。例如,当一个Python脚本在运行过程中抛出异常,其错误信息会被记录到Supervisor管理的日志文件中,方便开发人员定位问题。
  3. 进程分组管理
    • 可以将多个相关的进程划分到一个组中进行统一管理。例如,在一个Web应用程序环境中,你可以将Web服务器进程、后台任务处理进程等划分到一个名为“web_app_group”的组中。这样,你可以通过操作组来同时启动、停止或重启组内的所有进程,方便在部署或维护环境时进行操作。
  4. 远程管理
    • 支持通过XML - RPC接口进行远程管理。这意味着你可以在一台远程机器上,通过网络连接到运行Supervisor的服务器,对进程进行管理操作。比如,系统管理员可以在自己的管理控制台中,远程控制服务器上的各种服务进程,而无需直接登录到服务器。

二、安装和配置

  1. 安装
    • 在大多数Linux发行版中,可以使用包管理器进行安装。以Ubuntu为例,使用命令sudo apt - get install supervisor进行安装。在CentOS系统中,可以使用yum install supervisor命令安装。安装完成后,Supervisor的相关命令(如supervisorctl)就可以在系统中使用了。
  2. 配置文件
    • Supervisor的主要配置文件通常是/etc/supervisor/supervisord.conf。这个文件用于配置Supervisor自身的运行参数,如日志文件位置、监听的IP地址和端口等。同时,在/etc/supervisor/conf.d/目录下可以创建针对各个被管理进程的配置文件。
    • 例如,要配置一个简单的Python脚本进程,你可以在conf.d目录下创建一个名为my_python_script.conf的文件,内容可能如下:
    [program:my_python_script]
    command=/usr/bin/python /path/to/your/script.py
    directory=/path/to/your/script/directory
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/my_python_script.err.log
    stdout_logfile=/var/log/my_python_script.out.log
    
    • 在这个配置文件中,[program:my_python_script]是一个节(section)标题,用于标识这个配置是针对名为my_python_script的进程。command指定了要运行的命令,这里是运行一个Python脚本的命令。directory指定了执行命令的工作目录。autostartautorestart分别设置为true,表示进程会自动启动并且在意外退出时自动重启。stderr_logfilestdout_logfile则指定了标准错误和标准输出的日志文件路径。

三、使用方法

  1. 启动和停止进程
    • 使用supervisorctl命令来管理进程。要启动一个已经配置好的进程,例如上面提到的my_python_script,可以在命令行中输入supervisorctl start my_python_script。如果要停止这个进程,可以使用supervisorctl stop my_python_script
  2. 查看进程状态
    • 通过supervisorctl status命令可以查看所有被管理进程的状态。它会显示每个进程的名称、状态(如RUNNING、STOPPED等),以及进程已经运行的时间等信息。例如:
    my_python_script              RUNNING   pid 12345, uptime 0:10:30
    
    • 这个输出表示my_python_script进程正在运行,进程ID是12345,已经运行了10分30秒。
  3. 重新加载配置
    • 当你修改了Supervisor或者被管理进程的配置文件后,需要重新加载配置才能使修改生效。可以使用supervisorctl reload命令来重新加载配置。这会让Supervisor根据新的配置文件来启动、停止或调整被管理的进程。

Supervisor在服务器管理和自动化运维领域发挥着重要的作用,能够有效地提高进程管理的效率,保障服务的稳定运行。

配置文件详解

  1. Supervisor配置文件结构

    • Supervisor配置文件采用INI格式,主要由多个节(section)组成。每个节以方括号([])包围的名称开始,例如[supervisord][program:your_program_name]等。每个节包含一系列键 - 值对,用于设置相关的参数。
  2. 主配置节[supervisord]

    • logfile:指定Supervisor自身日志文件的路径。例如logfile=/var/log/supervisor/supervisord.log,Supervisor会将自己的运行情况、错误信息等记录在此日志文件中。
    • pidfile:设置Supervisor主进程的PID(进程标识符)文件位置,如pidfile=/var/run/supervisor/supervisord.pid。这个文件用于操作系统识别Supervisor主进程,方便对其进行管理,如发送信号来停止或重启它。
    • nodaemon:如果设置为true,Supervisor将在前台运行,通常用于调试目的。默认值为false,表示在后台以守护进程的方式运行。例如nodaemon=false
    • minfdsminprocsminfds规定了Supervisor启动时所需的最小文件描述符数量,minprocs规定了最小进程数量。这些参数在一些特殊的系统环境或者对资源有严格要求的场景下可能会用到,一般情况下可以使用默认值。
  3. HTTP服务器配置节[inet_http_server](可选)

    • port:用于设置HTTP接口监听的端口。例如port = 9001,通过这个端口可以使用浏览器或者其他HTTP客户端来远程访问Supervisor的管理界面,查看进程状态等信息。
    • usernamepassword:用于设置HTTP访问的认证信息,以增加安全性。例如username=adminpassword=your_password
  4. supervisorctl工具配置节[supervisorctl]

    • serverurl:指定supervisorctl连接Supervisor服务器的URL。通常格式为serverurl = http://localhost:9001,如果Supervisor是通过网络远程管理的,需要将localhost替换为实际的服务器IP地址。
  5. 进程配置节[program:your_program_name]

    • command:这是关键参数,用于指定要运行的进程的命令。例如,对于一个简单的Node.js服务器,可能是command = node /path/to/your/server.js
    • directory:指定进程运行的工作目录。例如directory=/path/to/your/program/directory,这个目录应该包含进程运行所需的所有文件,如代码文件、配置文件等。
    • autostart:设置为true时,Supervisor会在自身启动时自动启动该进程;设置为false则不会自动启动。例如autostart=true
    • autorestart:当设置为true,如果进程意外退出,Supervisor会自动重新启动它。例如autorestart=true
    • startsecs:定义了进程启动后,Supervisor等待多长时间后才认为进程启动成功。例如startsecs = 5,表示如果进程在启动后的5秒内没有退出,就认为它启动成功了。
    • stderr_logfilestdout_logfile:分别用于指定进程的标准错误和标准输出的日志文件路径。例如stderr_logfile=/var/log/your_program/error.logstdout_logfile=/var/log/your_program/output.log
  6. 完整示例

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisor/supervisord.pid
nodaemon=false[inet_http_server]
port = 9001
username = admin
password = your_password[supervisorctl]
serverurl = http://localhost:9001[program:my_web_server]
command = gunicorn -w 4 -b 0.0.0.0:8000 myapp:app
directory = /home/user/myapp
autostart = true
autorestart = true
startsecs = 5
stderr_logfile = /var/log/my_web_server/error.log
stdout_logfile = /var/log/my_web_server/output.log

在这个示例中:

  • 首先在[supervisord]节设置了Supervisor自身的日志文件和PID文件位置,并且让它在后台运行。
  • 接着在[inet_http_server]节开启了HTTP服务器监听端口9001,并设置了访问的用户名和密码,用于远程管理。
  • [supervisorctl]节配置了连接Supervisor服务器的URL。
  • 最后在[program:my_web_server]节配置了一个名为my_web_server的进程,它是一个使用Gunicorn运行的Flask应用程序(myapp:app是应用程序入口),设置了工作目录、自动启动和自动重启等参数,并且指定了标准错误和标准输出的日志文件路径。

其他高级用法

  1. 进程组管理
    • 创建进程组
      • 可以在配置文件中通过定义多个[program:xxx]节来创建进程组。这些进程可以是相关的服务,例如一个Web应用中,前端服务器(如Nginx)和后端服务器(如Gunicorn)可以放在一个组中。在配置文件中,它们的[program:xxx]节可以有类似[program:nginx][program:gunicorn]这样的标识。
    • 统一管理进程组
      • 使用supervisorctl命令对进程组进行操作。例如,如果将Nginx和Gunicorn进程定义在一个名为web_service_group的组中,可以使用supervisorctl start web_service_group:*来同时启动组内的所有进程。同样,supervisorctl stop web_service_group:*可以停止组内所有进程。这种统一管理方式在部署或更新服务时非常方便,可以确保相关进程按照正确的顺序启动和停止。
  2. 事件通知机制
    • 配置事件监听器
      • Supervisor支持通过配置事件监听器来接收进程相关的事件通知。可以在配置文件中设置[eventlistener:xxx]节。例如,[eventlistener:my_listener],在这个节中,通过command参数配置一个脚本或者程序来接收事件。这个脚本可以是用Python、Shell等语言编写的,用于处理Supervisor发送的事件消息。
    • 事件类型和处理
      • 常见的事件包括进程启动(PROCESS_STATE_STARTING)、进程停止(PROCESS_STATE_STOPPED)、进程退出(PROCESS_STATE_EXITED)等。当这些事件发生时,配置的监听器脚本会收到相应的消息。例如,当一个关键的服务进程停止时,监听器脚本可以发送一封电子邮件给管理员,提醒他们及时处理。
  3. 动态添加和删除进程配置
    • 使用RPC接口动态管理
      • Supervisor提供了XML - RPC接口,可以通过编程方式动态地添加、修改或删除进程配置。例如,在Python中,可以使用xmlrpc.client模块来连接Supervisor的RPC接口。以下是一个简单的示例代码,用于动态添加一个进程配置:
      import xmlrpc.client# 连接Supervisor的RPC接口
      supervisor_server = xmlrpc.client.ServerProxy("http://localhost:9001/RPC2")
      # 定义新进程的配置参数
      new_program_config = {"name": "new_program","command": "python /path/to/new_script.py","autostart": True,"autorestart": True
      }
      # 通过RPC接口添加新进程配置
      supervisor_server.supervisor.addProgramConfig(new_program_config)
      
      • 这样就可以在运行时动态地将一个新的进程添加到Supervisor的管理范围内,而无需手动修改配置文件并重新加载。同样,也可以通过RPC接口删除进程配置,实现更灵活的进程管理。
  4. 自定义监控脚本与Supervisor集成
    • 编写自定义监控脚本
      • 除了Supervisor自带的进程监控功能外,还可以编写自定义的监控脚本。例如,编写一个脚本用于监控进程的内存使用情况。这个脚本可以定期检查被管理进程的内存占用,并根据预设的阈值来判断是否需要采取措施。
    • 集成到Supervisor管理中
      • 将自定义监控脚本作为一个单独的[program:xxx]配置添加到Supervisor配置文件中。通过设置autostartautorestart参数,确保监控脚本能够持续运行。当监控脚本检测到异常情况(如进程内存占用过高)时,可以通过Supervisor的supervisorctl命令或者RPC接口来对相关进程进行处理,如重启进程或者调整其运行参数。

相关文献

【官网地址】

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

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

相关文章

C++编程等级认证学习计划

C编程等级认证学习计划 计划目标 在30天内系统学习并掌握C编程等级认证(一至八级)的知识点,为参加认证考试做好充分准备。 前期准备 学习资料收集 准备涵盖C编程一至八级知识点的专业教材,如《C Primer》等。收集相关的在线教…

Spring MVC实战指南:构建高效Web应用的架构与技巧(三)

响应数据和结果视图(7种) 返回值分类 创建web.xml&#xff08;spring、过滤器解决乱码、配置控制器dispatcherServlet、加载springmvc.xml文件、配置启动加载&#xff09;创建springmvc.xml文件 <!--配置了内容&#xff0c;启动Tomcat服务器的时候&#xff0c;就会被加载--…

Postgresql中clog与xid对应关系计算方法(速查表)

知道xid计算clog文件名 CREATE or REPLACE PROCEDURE get_clog_name(xid bigint) as $$ DECLAREpageno bigint;segno bigint; BEGIN-- 页面号&#xff1a;一个页面8K&#xff0c;一个字节8位能存4个事务的状态。pageno : xid / (8192 * 4);-- 段号&#xff1a;一个段&#xf…

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考&#xff0c;oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场&#xff0c;主要考察 nmap的使用已经是否会看输出&#xff0c;以及是否会通过应用查找对应漏…

Linux下编译安装PETSc

本文记录在Linux下编译安装PETSc的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 安装oneAPI 参见&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 1.2 安…

51单片机——蜂鸣器模块

P2.5管脚控制蜂鸣器 #include "reg51.h" typedef unsigned int u16; typedef unsigned char u8;sbit BEEPP2^5; void delay(time){ while(time--); } void main(){ u16 i2000; //脉冲2000次 while(1){ while(i--){ BEEP!BEEP; //…

【HAProxy】如何在Ubuntu下配置HAProxy服务器

HAProxy 是一款免费、开源且强大的反向代理程序&#xff0c;它为 HTTP 和 TCP 基础的应用提供了高可用性、负载均衡以及代理功能&#xff0c;因此对于管理高流量服务器&#xff08;或 Web 应用&#xff09;来说&#xff0c;通过将负载分散到多个节点服务器上&#xff0c;它是一…

深入Android架构(从线程到AIDL)_11 线程之间的通信架构

目录 5、 线程之间的通信架构 认识Looper与Handler对象 主线程丢信息给自己 子线程丢信息给主线程 替子线程诞生Looper与MQ 5、 线程之间的通信架构 认识Looper与Handler对象 当主线程诞生时&#xff0c;就会去执行一个代码循环(Looper)&#xff0c;以便持续监视它的信息…

【中间件】docker+kafka单节点部署---zookeeper模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控&#xff0c;先在测试环境部署单节点kafka验证…

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程&#xff0c;实现开发板和超拟人大模型进行语音交互&#xff0c;支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人&#xff0c;如果当前SDK在v2.3.o以下&#xff0c;需要更新SDK。在SDK目录(duomotai_ap)下…

2024年, Milvus 社区的那些事

随着跨年钟声响起&#xff0c;2024 年告一段落。这一年&#xff0c;Milvus GitHub Stars 正式突破 3 万大关&#xff0c;Docker 下载量突破6700w 次&#xff0c;达到一个新的里程碑&#xff0c;在开源向量数据库领域继续引领前行。在这遥遥领先的数据背后&#xff0c;不妨让我们…

9999999999

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

docker中使用Volume完成数据共享

情景概述 在一个docker中&#xff0c;部署两个MySQL容器&#xff0c;假如它们的数据都存储在自己容器内部的data目录中。这样的存储方式会有以下问题&#xff1a; 1.无法保证两个MySQL容器中的数据同步。 2.容器删除后&#xff0c;数据就会丢失。 基于以上问题&#xff0c;容…

【期末复习】二、进程管理

1.进程的内存结构🍊 程序加载到内存之后就变成了一个进程,进程在内存当中的一个结构有: 文本段(text section):存放程序代码 栈(stack):存放局部变量和函数返回地址 数据段(data section):存放全局变量和静态变量(static) 堆(heap):程序运行时的动态内存分…

Type-C多口适配器:高效充电与连接解决方案

在科技飞速发展的今天&#xff0c;我们的生活已经离不开各种各样的电子设备&#xff0c;如智能手机、平板电脑、智能手表和无线耳机等。这些设备不仅丰富了我们的数字生活&#xff0c;也带来了更多的充电需求。传统的单一充电口已经难以满足现代人对于便捷性和效率的追求&#…

UCAS 24秋网络认证技术 CH10 SSL 复习

TLS字段、参数含义要了解每个消息是什么意思 基本方式只验证服务端&#xff0c;服务端有证书&#xff0c;变形方式加上验证客户端TLS1.3区别 协商过程 背景 Record层使用的各种加密算法参数&#xff0c;均由Handshake协议协商获得。 具体过程 随机数交换 Client/Server相互…

支付宝商家转账到账户余额,支持多商户管理

大家好&#xff0c;我是小悟 转账到支付宝账户是一种通过 API 完成单笔转账的功能&#xff0c;支付宝商家可以向其他支付宝账户进行单笔转账。 商家只需输入另一个正确的支付宝账号&#xff0c;即可将资金从本企业支付宝账户转账至另一个支付宝账户。 该产品适用行业较广&am…

c# 中Parallel.ForEach 对其中一个变量进行赋值 引发报错

在 C# 中使用 Parallel.ForEach 方法时&#xff0c;如果你尝试在并行循环中对共享变量进行赋值&#xff0c;很可能会遇到线程安全问题或竞争条件&#xff08;race conditions&#xff09;&#xff0c;这可能导致数据不一致、程序崩溃或其他不可预测的行为。 问题描述 假设你有…

基于Django的旅游信息管理系统(源码+lw+部署文档+讲解),源码可白嫖!

摘要 随着我国经济的高速发展与人们生活水平的日益提高&#xff0c;人们对生活质量的追求也多种多样。尤其在人们生活节奏不断加快的当下&#xff0c;人们更趋向于足不出户解决生活上的问题&#xff0c;线上管理系统展现了其蓬勃生命力和广阔的前景。与此同时&#xff0c;随着…

常见的框架漏洞复现

1.Thinkphp Thinkphp5x远程命令执行及getshell 搭建靶场 cd vulhub/thinkphp/5-rce docker-compose up -d 首页 漏洞根本源于 thinkphp/library/think/Request.php 中method方法可以进行变量覆盖&#xff0c;通过覆盖类的核心属性filter导致rce&#xff0c;其攻击点较为多&…