当前位置: 首页 > news >正文

Linux 进程管理工具 Supervisor

介绍

Supervisor 是一个用 Python 编写的进程管理工具,旨在帮助你监控和控制多个进程。它特别适用于需要确保某些服务在服务器启动时自动运行,并且在崩溃时自动重启的场景。

写在前面:

因为现在很多第三方的包的最新版本都是基于 python3了,包括本文中提到的 setuptools。所以建议使用 python3 进行安装操作,否则可能会出现一系列缺包又难解决的问题!

安装 Supervisor

安装说明取决于您尝试在其上安装 Supervisor 的系统是否具有互联网访问权限。

联网在线安装

使用 Pip 进行在线安装

可以使用 pip install 来安装 Supervisor:

pip install supervisor

根据您系统 Python 的权限,您可能需要是 root 用户才能成功使用 pip 安装 Supervisor。

您也可以通过 pip 在 virtualenv 中安装 supervisor。

不使用 Pip 的在线安装

如果您的系统没有安装 pip,您将需要下载 Supervisor 发行版并通过手动方式安装。当前和以前版本的 Supervisor 可以从 PyPi 下载。解压软件包后,运行 python3 setup.py install。这需要互联网访问权限,它会下载并安装 Supervisor 所依赖的所有分发包,最后再安装 Supervisor 本身。

根据您系统 Python 的权限,您可能需要是 root 用户才能成功调用 python3 setup.py install

离线安装

如果您希望安装 Supervisor 的系统没有互联网访问权限,则需要稍微不同的方式进行安装。由于 pippython3 setup.py install 都依赖于互联网来执行依赖软件的下载,因此在未安装依赖项的情况下,两者都不会在没有互联网连接的机器上工作。要安装到没有互联网连接的机器上,在一台有互联网连接的机器上获取以下依赖项:

  • setuptools(最新版)来自 https://pypi.org/pypi/setuptools/。

将这些文件复制到可移动媒体,并将其放置在目标机器上。按照每个文件的说明在目标机器上安装它们。通常这意味着解压缩每个模块的文件并在解压缩目录中调用 python3 setup.py install。在所有依赖的模块都安装完成后,最后在 supervisor 目录中运行 python3 setup.py install

根据您系统 Python 的权限,您可能需要是 root 用户才能为每个包成功调用 python3 setup.py install

创建配置文件

一旦Supervisor安装完成,运行echo_supervisord_conf。这将打印一个“示例”Supervisor配置文件到您的终端的标准输出。

当您看到文件被显示在终端上时,重新输入命令echo_supervisord_conf > /etc/supervisor/supervisord.conf。如果您没有root权限,此命令将无法工作。

如果您没有root权限,或者您不希望将supervisord.conf文件放置在/etc/supervisor/supervisord.conf,您可以将其放在当前目录下(通过运行echo_supervisord_conf > supervisord.conf),并在启动supervisord时使用-c标志来指定配置文件的位置。

例如,使用supervisord -c supervisord.conf。如果配置文件在当前执行命令的目录中,使用-c标志实际上是多余的,因为supervisord 会先在当前目录下搜索supervisord.conf文件,如果当前目录不存在配置文件,会默认读取 /etc/supervisor/supervisord.conf 配置文件(这个默认的配置文件位置从 3.3.0 版本开始)。

配置文件解释说明如下:

; 示例 supervisor 配置文件。
;
; 有关配置文件的更多信息,请参阅:
; http://supervisord.org/configuration.html
;
; 注意事项:
;  - 不支持 Shell 扩展(如 "~""$HOME")。环境变量可通过语法 "%(ENV_HOME)s" 扩展。
;  - 除下方 environment= 选项外,其他值不支持引号包裹。
;  - 注释必须以空格开头,例如:"a=b ;注释" 有效,而 "a=b;注释" 无效。
;  - 若命令类似配置文件注释会被截断。例如:"command=bash -c 'foo ; bar'" 会被截断为 "command=bash -c 'foo ";
; 警告:
;  此示例文件中多处使用 /tmp 路径,因大多数系统支持该路径。实际使用时请替换为更合适的路径。
;  部分系统会定期清理 /tmp 中的旧文件。特别注意:若下方 [unix_http_server] 中定义的 socket 文件被删除,
;  supervisorctl 将无法连接 supervisord。

[unix_http_server]
file=/tmp/supervisor.sock   ; socket 文件路径
;chmod=0700                 ; socket 文件权限(默认 0700)
;chown=nobody:nogroup       ; socket 文件所属用户:组
;username=user              ; 用户名(默认无认证)
;password=123               ; 密码(默认无认证)

; 安全警告:
;  默认不启用 inet HTTP 服务器。取消下方 [inet_http_server] 的注释以启用。
;  inet HTTP 服务器仅限可信环境使用,应绑定到 localhost 或隔离的信任网络。
;  inet HTTP 服务器不支持加密,默认无认证(可通过 username=password= 添加认证)。
;  切勿将 inet HTTP 服务器暴露到公网。

;[inet_http_server]         ; 默认禁用 inet (TCP) 服务器
;port=127.0.0.1:9001        ; 监听地址:端口(*:port 表示所有接口)
;username=user              ; 用户名(默认无认证)
;password=123               ; 密码(默认无认证)

[supervisord]
logfile=/tmp/supervisord.log ; 主日志文件路径(默认 $CWD/supervisord.log)
logfile_maxbytes=50MB        ; 日志文件最大大小(默认 50MB)
logfile_backups=10           ; 日志备份数量(0 表示不备份,默认 10loglevel=info                ; 日志级别(默认 info;可选 debug,warn,trace)
pidfile=/tmp/supervisord.pid ; PID 文件路径(默认 supervisord.pid)
nodaemon=false               ; 是否前台运行(true 前台运行,默认 false)
silent=false                 ; 是否禁止日志输出到 stdout(默认 false)
minfds=1024                  ; 所需最小可用文件描述符(默认 1024minprocs=200                 ; 所需最小进程描述符(默认 200;umask=022                   ; 进程文件创建 umask(默认 022)
;user=supervisord            ; 启动时切换至此用户(建议以 root 运行时设置)
;identifier=supervisor       ; 唯一标识符(默认 'supervisor';directory=/tmp              ; 启动时切换至此目录(默认不切换)
;nocleanup=true              ; 启动时不清理临时文件(默认 false)
;childlogdir=/tmp            ; 子进程日志目录(默认 $TEMP;environment=KEY="value"     ; 环境变量键值对
;strip_ansi=false            ; 是否去除日志中的 ANSI 转义码(默认 false)

; [rpcinterface:supervisor] 必须保留以支持 RPC(supervisorctl/web 接口)
; 可通过定义 [rpcinterface:x] 添加其他接口

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

; [supervisorctl] 配置连接 supervisord 的方式
; 需与 [unix_http_server][inet_http_server] 配置匹配

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 使用 unix:// URL 连接 unix socket
;serverurl=http://127.0.0.1:9001      ; 使用 http:// URL 连接 inet socket
;username=chris              ; 需与 [*_http_server] 中的用户名一致
;password=123                ; 需与 [*_http_server] 中的密码一致
;prompt=mysupervisor         ; 命令行提示符(默认 "supervisor";history_file=~/.sc_history  ; 使用 readline 历史记录(若可用)

; 以下 [program:theprogramname] 示例展示了所有可用的程序配置项
; 创建实际的 [program:x] 段落后,即可通过 supervisor 管理对应进程

;[program:theprogramname]
;command=/bin/cat              ; 要执行的命令(相对路径使用环境变量 PATH,可以带参数)
;process_name=%(program_name)s ; 进程名表达式(默认 %(program_name)s)
;numprocs=1                    ; 启动的进程副本数(默认 1;directory=/tmp                ; 执行前切换至此目录(默认不切换)
;umask=022                     ; 进程 umask(默认 None)
;priority=999                  ; 启动优先级(默认 999;autostart=true                ; 随 supervisord 启动(默认 true)
;startsecs=1                   ; 进程持续运行至少多少秒才认为启动成功(默认 1;startretries=3                ; 启动失败后的最大重试次数(默认 3;autorestart=unexpected        ; 退出后自动重启策略(默认 unexpected)
;exitcodes=0                   ; autorestart 视为成功的退出码(默认 0;stopsignal=QUIT               ; 终止进程的信号(默认 TERM;stopwaitsecs=10               ; 发送 SIGKILL 前的等待秒数(默认 10;stopasgroup=false             ; 是否向进程组发送停止信号(默认 false)
;killasgroup=false             ; 是否向进程组发送 SIGKILL(默认 false)
;user=chrism                   ; 运行此进程的用户身份
;redirect_stderr=true          ; 是否将 stderr 重定向到 stdout(默认 false)
;stdout_logfile=/a/path        ; stdout 日志路径(NONE 表示不记录;默认 AUTO)
;stdout_logfile_maxbytes=1MB   ; stdout 日志最大大小(默认 50MB)
;stdout_logfile_backups=10     ; stdout 日志备份数(0 表示无备份,默认 10;stdout_capture_maxbytes=1MB   ; 捕获模式下的最大字节数(默认 0;stdout_events_enabled=false   ; 是否触发 stdout 写入事件(默认 false)
;stdout_syslog=false           ; 是否将 stdout 发送到 syslog(默认 false)
;stderr_logfile=/a/path        ; stderr 日志路径(NONE 表示不记录;默认 AUTO)
;stderr_logfile_maxbytes=1MB   ; stderr 日志最大大小(默认 50MB)
;stderr_logfile_backups=10     ; stderr 日志备份数(0 表示无备份,默认 10;stderr_capture_maxbytes=1MB   ; 捕获模式下的最大字节数(默认 0;stderr_events_enabled=false   ; 是否触发 stderr 写入事件(默认 false)
;stderr_syslog=false           ; 是否将 stderr 发送到 syslog(默认 false)
;environment=A="1",B="2"       ; 环境变量键值对(默认不添加)
;serverurl=AUTO                ; 覆盖 serverurl 计算逻辑(childutils)

; 以下 [eventlistener:theeventlistenername] 示例展示了所有事件监听器配置项
; 创建实际的 [eventlistener:x] 段落后,即可处理 supervisord 发送的事件通知

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; 要执行的命令(相对路径使用环境变量 PATH,可以带参数)
;process_name=%(program_name)s ; 进程名表达式(默认 %(program_name)s)
;numprocs=1                    ; 启动的进程副本数(默认 1;events=EVENT                  ; 订阅的事件类型(必须设置)
;buffer_size=10                ; 事件缓冲区队列大小(默认 10;directory=/tmp                ; 执行前切换至此目录(默认不切换)
;umask=022                     ; 进程 umask(默认 None)
;priority=-1                   ; 启动优先级(默认 -1)
;autostart=true                ; 随 supervisord 启动(默认 true)
;startsecs=1                   ; 进程持续运行至少多少秒才认为启动成功(默认 1;startretries=3                ; 启动失败后的最大重试次数(默认 3;autorestart=unexpected        ; 退出后自动重启策略(默认 unexpected)
;exitcodes=0                   ; autorestart 视为成功的退出码(默认 0;stopsignal=QUIT               ; 终止进程的信号(默认 TERM;stopwaitsecs=10               ; 发送 SIGKILL 前的等待秒数(默认 10;stopasgroup=false             ; 是否向进程组发送停止信号(默认 false)
;killasgroup=false             ; 是否向进程组发送 SIGKILL(默认 false)
;user=chrism                   ; 运行此进程的用户身份
;redirect_stderr=false         ; 事件监听器不允许 redirect_stderr=true
;stdout_logfile=/a/path        ; stdout 日志路径(NONE 表示不记录;默认 AUTO)
;stdout_logfile_maxbytes=1MB   ; stdout 日志最大大小(默认 50MB)
;stdout_logfile_backups=10     ; stdout 日志备份数(0 表示无备份,默认 10;stdout_events_enabled=false   ; 是否触发 stdout 写入事件(默认 false)
;stdout_syslog=false           ; 是否将 stdout 发送到 syslog(默认 false)
;stderr_logfile=/a/path        ; stderr 日志路径(NONE 表示不记录;默认 AUTO)
;stderr_logfile_maxbytes=1MB   ; stderr 日志最大大小(默认 50MB)
;stderr_logfile_backups=10     ; stderr 日志备份数(0 表示无备份,默认 10;stderr_events_enabled=false   ; 是否触发 stderr 写入事件(默认 false)
;stderr_syslog=false           ; 是否将 stderr 发送到 syslog(默认 false)
;environment=A="1",B="2"       ; 环境变量键值对
;serverurl=AUTO                ; 覆盖 serverurl 计算逻辑(childutils)

; 以下 [group:thegroupname] 示例展示了组配置项
; 创建实际的 [group:x] 段落后,可管理异构进程组

;[group:thegroupname]
;programs=progname1,progname2  ; 包含的进程列表(对应 [program:x] 中的 x)
;priority=999                  ; 启动优先级(默认 999; [include] 用于引入其他配置文件
; files 设置支持通配符,路径相对于本文件。被引入的文件不能再引入其他文件

;[include]
;files = relative/directory/*.ini

一旦您的文件系统中有了基础配置文件,接下来就可以创建并配置程序了。

Supervisor的启动和停止

  • 启动Supervisor服务
supervisord -c /etc/supervisor/supervisord.conf
  • 停止Supervisor服务
supervisorctl shutdown
  • 重新完全加载Supervisor配置文件(如果希望完全重启服务,先shutdown再启动服务)
supervisorctl reload

配置Supervisor

Supervisor 的主要配置文件位于 /etc/supervisor/supervisord.conf。所有程序的配置集中放在 /etc/supervisor/conf.d/ 目录中。

添加程序配置

Supervisor 会读取 /etc/supervisor/conf.d/ 目录下的所有 .conf 文件。你可以在这个目录下创建一个新的配置文件来定义你的程序。

例如,创建一个名为 myapp.conf 的文件:

[program:myapp]
directory=/path/to/myapp
command=/usr/bin/python3 /path/to/myapp/main.py
user=myuser
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log

常见配置项解释

  • [program:myapp]:定义一个名为 myapp 的程序。
  • directory:指定程序的工作目录。
  • command:指定要执行的命令。
  • user:指定以哪个用户身份运行该程序。
  • autostart:指定在 Supervisor 启动时是否自动启动该程序。
  • autorestart:指定在程序退出时是否自动重启。
  • stderr_logfilestdout_logfile:指定标准错误输出和标准输出日志文件的路径。

加载新的配置

每次修改配置文件后,需要重新加载 Supervisor 配置:

sudo supervisorctl reread
sudo supervisorctl update

如果你在配置文件中添加了新的程序或组,update 会启动这些新定义的程序。
如果你修改了现有程序的配置(如改变了命令行参数、工作目录等),update 会停止并重新启动受影响的程序以应用更改。
如果你从配置文件中删除了某个程序或组,update 会停止并移除这些不再需要管理的程序。

管理进程

使用 supervisorctl 管理

使用 supervisorctl 命令可以方便地启动、停止和重启程序。

  • 启动程序:

    sudo supervisorctl start myapp
    
  • 停止程序:

    sudo supervisorctl stop myapp
    
  • 重启程序:

    sudo supervisorctl restart myapp
    
  • 查看状态:

    sudo supervisorctl status
    

Web 管理界面

Supervisor 提供了一个简单的 Web 界面,可以帮助你更直观地管理和监控进程。

  1. 启用 Web 管理界面

    编辑 /etc/supervisor/supervisord.conf 文件,取消 [inet_http_server] 部分的注释,并设置监听地址和端口:

    [inet_http_server]
    port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
    username=user     ; (default is no username (open server))
    password=123      ; (default is no password (open server))
    

需要特别注意的是:如果你希望在电脑上可以远程访问这个web界面,请需要将 127.0.0.1:9001 修改为 *:9001,否则只能在服务器自身通过 http://127.0.0.1:9001 访问。

  1. 重启 Supervisor

    sudo supervisord reload
    
  2. 访问 Web 界面

    打开浏览器并访问 http://127.0.0.1:9001,输入用户名和密码登录即可查看和管理进程。

常见问题

如何调试 Supervisor?

你可以通过增加日志级别来获取更多的调试信息。在 supervisord.conf 中设置:

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
loglevel=debug                   ; (log level;default info; others: debug,warn,trace)

然后重新加载 Supervisor:

sudo supervisorctl reload

官方资料

  • Supervisor 官网
  • Supervisor GitHub

通过以上步骤,你可以有效地使用 Supervisor 来管理和监控你的应用程序。希望这篇文章能帮助你更好地理解和应用 Supervisor。


(END)

相关文章:

  • 【线程与进程的区别和联系】
  • 深度学习驱动的跨行业智能化革命:技术突破与实践创新
  • im即时聊天客服系统SaaS还是私有化部署:成本、安全与定制化的权衡策略
  • linux-git
  • 设计模式--单例模式(Singleton)【C++】
  • Celia智能助手系统架构设计与技术实现全解析
  • MobileMamba: Lightweight Multi-Receptive Visual Mamba Network——论文笔记
  • 一套企业级智能制造云MES系统源码, vue-element-plus-admin+springboot
  • deepin安装rust
  • Unity自定义区域UI滑动事件
  • Facebook 的历史与发展:从校园网站到全球社交平台
  • 考网络安全工程师证要什么条件才能考?
  • 无线可视挖耳勺适合老年人吗?无线可视挖耳勺操作简单又安全
  • 正十七边形尺规作图证明——从高斯的发现到几何实现
  • 如何在语言模型的参数中封装知识?——以T5模型为例
  • 智能合约中权限管理不当
  • TypeError: null is not an object
  • 基于Python实现长尾数驱动的故障轴承诊断方法的示例
  • AutoGen学习笔记系列(四)Tutorial -Teams
  • 椭圆曲线密码学数学证明推导及实践:基于Python实现与GPU加速GUI演示
  • 无代码做网站/四川百度推广排名查询
  • 做网站用的什么空间/常用的网络营销平台有哪些
  • 网站对公司的作用是什么意思/企业网站搜索引擎推广方法
  • 网站建设与管理/网站的建设流程
  • 站长平台验证网站/关键词搜索神器
  • 海口做网站要多少钱/常州网站优化