如何安装和管理Supervisor

来自菜鸟教程
跳转至:导航、​搜索

介绍

在许多 VPS 环境中,通常情况下,您会拥有许多想要持久运行的小程序,无论这些是小型 shell 脚本、Node.js 应用程序还是任何大型包。

通常,外部包提供了一个 单元文件,允许它们由初始化系统管理,例如 systemd,或者打包为 docker 图像,可以由容器引擎管理。 但是,对于没有很好打包的软件,或者对于不想与服务器上的低级初始化系统交互的用户,有一个轻量级的替代方案会很有帮助。

Supervisor 是一个进程管理器,它提供了一个单一的接口来管理和监视许多长时间运行的程序。 在本教程中,您将在 Linux 服务器上安装 Supervisor,并学习如何管理多个应用程序的 Supervisor 配置。

先决条件

要完成本指南,您需要:

  • Linux 服务器和具有 sudo 权限的非 root 用户。 您可以在我们的 Initial Server Setup with Ubuntu 20.04 指南中了解有关如何设置具有这些权限的用户的更多信息。

或者,您可以使用此页面上嵌入的交互式终端来试验本教程中的示例命令。 单击以下 Launch an Interactive Terminal! 按钮以打开终端窗口并开始使用 Linux (Ubuntu) 环境。

启动交互式终端!

第 1 步 - 安装

首先更新你的包源并安装Supervisor:

sudo apt update && sudo apt install supervisor

主管服务在安装后自动运行。 您可以检查其状态:

sudo systemctl status supervisor

您应该收到以下输出:

Output● supervisor.service - Supervisor process control system for UNIX
     Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2021-11-17 22:56:48 UTC; 5min ago

现在我们已经安装了 Supervisor,我们可以看看添加我们的第一个程序。

第 2 步 - 添加程序

使用 Supervisor 的最佳实践是为它将处理的每个程序编写一个配置文件。

在 Supervisor 下运行的所有程序都必须在 非守护模式 (有时也称为“前台模式”)下运行。 如果默认情况下你的程序在运行后会自动返回到 shell,那么你可能需要查阅程序的手册来找到启用此模式的选项,否则 Supervisor 将无法正确确定程序的状态。


为了演示 Supervisor 的功能,我们将创建一个 shell 脚本,它除了每秒产生一些可预测的输出之外什么都不做,但会在后台连续运行,直到手动停止。 使用 nano 或您喜欢的文本编辑器,在您的主目录中打开一个名为 idle.sh 的文件:

nano ~/idle.sh

添加以下内容:

~/idle.sh

#!/bin/bash
while true
do 
    # Echo current date to stdout
    echo `date`
    # Echo 'error!' to stderr
    echo 'error!' >&2
    sleep 1
done

保存并关闭文件。 如果您正在使用 nano,请按 Ctrl+X,然后在出现提示时按 Y 并回车。

接下来,使您的脚本可执行:

chmod +x ~/idle.sh

Supervisor 程序的 per-program 配置文件位于 /etc/supervisor/conf.d 目录中,通常每个文件运行一个程序并以 .conf. 结尾我们将为该脚本创建一个配置文件,如`/等/主管/conf.d/idle.conf:

sudo nano /etc/supervisor/conf.d/idle.conf

添加这些内容:

/etc/supervisor/conf.d/idle.conf

command=/home/ubuntu/idle.sh
autostart=true
autorestart=true
stderr_logfile=/var/log/idle.err.log
stdout_logfile=/var/log/idle.out.log

我们将逐行回顾这一点:

command=/home/ubuntu/idle.sh

配置首先定义一个名为 idle 的程序和程序的完整路径:

autostart=true
autorestart=true

接下来的两行定义了脚本在特定条件下的自动行为。

autostart 选项告诉 Supervisor 这个程序应该在系统启动时启动。 将此设置为 false 将需要在任何系统关闭后手动启动。

autorestart 定义了在程序退出时 Supervisor 应如何管理程序:

  • false 告诉 Supervisor 在程序退出后永远不要重新启动程序。
  • true 告诉 Supervisor 在程序退出后总是重新启动程序。
  • unexpected 告诉 Supervisor 仅在程序以意外错误代码退出时才重新启动程序(默认情况下,代码 0 或 2 除外)。 要了解有关错误代码的更多信息,请查看 errno 命令。
stderr_logfile=/var/log/idle.err.log
stdout_logfile=/var/log/idle.out.log

最后两行定义程序的两个主要日志文件的位置。 正如选项名称所建议的那样,stdout 和 stderr 将分别被定向到 stdout_logfilestderr_logfile 位置。 指定的目录必须已经存在,因为 Supervisor 不会尝试创建任何缺失的目录。

我们在此处创建的配置是 Supervisor 程序的最小模板。 Supervisor 文档 列出了更多可选配置选项,可用于调整程序的运行方式。

创建并保存配置文件后,我们可以通过 supervisorctl 命令通知 Supervisor 我们的新程序。 首先,我们告诉 Supervisor 在 /etc/supervisor/conf.d 目录中查找任何新的或更改的程序配置:

sudo supervisorctl reread
Outputidle: available

然后告诉它通过以下方式进行任何更改:

sudo supervisorctl update
Outputidle: added process group

每当您对任何程序配置文件进行更改时,运行前面的两个命令都会使更改生效。

此时我们的程序应该正在运行。 我们可以通过查看输出日志文件来检查它的输出:

sudo tail /var/log/idle.out.log
OutputSat Nov 20 22:21:22 UTC 2021
Sat Nov 20 22:21:23 UTC 2021
Sat Nov 20 22:21:24 UTC 2021
Sat Nov 20 22:21:25 UTC 2021
Sat Nov 20 22:21:26 UTC 2021
Sat Nov 20 22:21:27 UTC 2021
Sat Nov 20 22:21:28 UTC 2021
Sat Nov 20 22:21:29 UTC 2021
Sat Nov 20 22:21:30 UTC 2021
Sat Nov 20 22:21:31 UTC 2021

接下来,我们将介绍 Supervisor 的其他一些用法。

第 3 步 - 管理程序

除了正在运行的程序之外,您还需要停止、重新启动或查看它们的状态。 我们在 Step 2 中使用的 supervisorctl 程序也有一个交互模式,我们可以使用它来控制我们的程序。

要进入交互模式,请运行不带参数的 supervisorctl:

sudo supervisorctl
Outputidle                      RUNNING    pid 12614, uptime 1:49:37
supervisor>

supervisorctl 最初会打印所有已配置程序的状态和正常运行时间,然后是其命令提示符。 输入 help 将显示其所有可用命令:

supervisor> help
Outputdefault commands (type help <topic>):
=====================================
add    clear  fg        open  quit    remove  restart   start   stop  update
avail  exit   maintail  pid   reload  reread  shutdown  status  tail  version

您可以 startstop 使用相关命令后跟程序名称的程序:

supervisor> stop idle
Outputidle: stopped
supervisor> start idle
Outputidle: started

使用 tail 命令,您可以查看程序的 stdout 和 stderr 日志中的最新条目:

supervisor> tail idle
OutputSun Nov 21 00:36:10 UTC 2021
Sun Nov 21 00:36:11 UTC 2021
Sun Nov 21 00:36:12 UTC 2021
Sun Nov 21 00:36:13 UTC 2021
Sun Nov 21 00:36:14 UTC 2021
Sun Nov 21 00:36:15 UTC 2021
Sun Nov 21 00:36:17 UTC 2021
supervisor> tail idle stderr
Outputerror!
error!
error!
error!
error!
error!
error!

使用 status 可以在进行任何更改后再次查看每个程序的当前执行状态:

supervisor> status
Outputidle                      STOPPED    Nov 21 01:07 AM

最后,您可以使用 Ctrl+C 或在提示符中输入 quit 退出 supervisorctl:

supervisor> quit

结论

在本教程中,您学习了如何安装和管理 Supervisor。 如前所述,按照现代标准,Supervisor 非常轻量级,但它仍然得到很好的维护,对于小型部署来说,它可能是一个有用的工具。 作为大型部署的组成部分,它也是一种低维护且独立的方式来生成日志。

如果您正在运行多个需要 Web 访问的小型应用程序,您可能还想了解 将 Nginx 配置为反向代理 ,这是小型可重用部署的另一个基本组件。