如何在 Ubuntu 上安装和配置 Supervisor

介绍

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

通常,外部包随单元文件一起提供,允许它们由 init 系统(如 systemd)管理,或者打包为可由容器引擎管理的 docker 映像。但是,对于未很好地打包的软件,或者对于不希望与服务器上的低级 init 系统交互的用户,拥有轻量级替代方案是有帮助的。

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

以下是 Supervisor 的主要优势:

  • 方便:为所有单流程实例编写 rc.d 很不方便。同样,Rc.d 脚本不会自动重新启动崩溃的进程。但是,可以将 Supervisor 配置为在进程崩溃时自动重启进程。
  • 准确性:  在 UNIX 中,通常很难获得进程的准确启动/停止状态。Supervisor 将进程作为子进程启动,因此它知道其子进程的 up/down 状态。这很容易为最终用户查询。

第 1 步 - 安装

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

$ sudo apt update && sudo apt install supervisor

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

 

添加以下内容:

#!/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,然后在出现提示时按YEnter。

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

$ chmod +x ~/idle.sh

Supervisor程序的每个程序配置文件位于 /etc/supervisor/conf.d 目录中,通常每个文件运行一个程序,并以 .conf 结尾。我们将为此脚本创建一个配置文件,as'/etc/supervisor/conf.d/idle.conf:

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

添加这些内容:

[program:idle]
command=/home/ubuntu/idle.sh
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/idle.err.log
stdout_logfile=/var/log/idle.out.log

我们将逐行回顾这一点:

command=/home/ubuntu/idle.sh

 

配置首先定义一个程序,其名称为 idle 和该程序的完整路径

autostart=true
autorestart=true
startretries=3

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

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
Output
idle: available
 然后告诉它通过以下方式进行任何更改:
$ sudo supervisorctl update
Output
idle: added process group

每当您对任何程序配置文件进行更改时,运行前面的两个命令都会使更改生效。
此时我们的程序应该正在运行。我们可以通过查看输出日志文件来检查它的输出:

$ sudo tail /var/log/idle.out.log
输出:
2022年 05月 29日 星期日 13:17:44 CST
2022年 05月 29日 星期日 13:17:45 CST
2022年 05月 29日 星期日 13:17:46 CST
2022年 05月 29日 星期日 13:17:47 CST
2022年 05月 29日 星期日 13:17:48 CST
2022年 05月 29日 星期日 13:17:49 CST
2022年 05月 29日 星期日 13:17:50 CST
2022年 05月 29日 星期日 13:17:51 CST
2022年 05月 29日 星期日 13:17:52 CST
2022年 05月 29日 星期日 13:17:53 CST

 

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

第 3 步 - 管理程序

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

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

$ sudo supervisorctl
Output
idle                      RUNNING    pid 12614, uptime 1:49:37
supervisor>

 

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

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

 

您可以使用关联的命令后跟程序名称来start or stop程序:

$ supervisor> stop idle
Output
idle: stopped
$ supervisor> start idle
Output
idle: started

 

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

$ supervisor> tail idle
Output
Sun 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
Output
error!
error!
error!
error!
error!
error!
error!

 

使用status您可以在进行任何更改后再次查看每个程序的当前执行状态:
$ supervisor> status
Output
idle                      STOPPED    Nov 21 01:07 AM

 

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

$ supervisor> quit

 

第 4 步 - 启用 Supervisor Web 界面

Supervisor 提供了一个基于 Web 的界面来管理所有进程,但默认情况下它是禁用的。您可以通过编辑文件 /etc/supervisor/supervisord.conf 来启用它:

$ nano /etc/supervisor/supervisord.conf

 

添加以下行:

[inet_http_server]
port=*:9001
username=admin
password=admin

 

保存并关闭文件,然后重新启动 Supervisor 服务以应用更改:

$ systemctl restart supervisor

 


第 5 步 - 访问Supervisor Web 界面

您现在可以使用 URL http://your-server-ip:9001访问 Supervisor Web 界面。系统将要求您提供用户名和密码,如下所示:

提供您在配置文件中定义的管理员用户名和密码,然后单击登录按钮。您应该在以下页面中看到 Supervisor Web 界面:

结论

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

最后更新于 2022年6月22日

如何在 Ubuntu 上安装和配置 Supervisor
标签: