3

如何在 Ubuntu 上安装和配置 Supervisor

 2 years ago
source link: https://blog.p2hp.com/archives/8582
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

如何在 Ubuntu 上安装和配置 Supervisor

如何在 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
  1. $ sudo apt update && sudo apt install supervisor
$ sudo apt update && sudo apt install supervisor

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

$ sudo systemctl status 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
  1. Output
  2. ● supervisor.service - Supervisor process control system for UNIX
  3. Loaded: loaded (/lib/systemd/system/supervisor.service; enabled; vendor preset: enabled)
  4. Active: active (running) since Wed 2021-11-17 22:56:48 UTC; 5min ago
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
  1. $ 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
  1. #!/bin/bash
  2. while true
  3. # Echo current date to stdout
  4. echo `date`
  5. # Echo 'error!' to stderr
  6. echo 'error!' >&2
  7. sleep 1
#!/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
  1. $ chmod +x ~/idle.sh
$ 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
  1. $ sudo nano /etc/supervisor/conf.d/idle.conf
$ sudo nano /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
  1. command=/home/ubuntu/idle.sh
  2. autostart=true
  3. autorestart=true
  4. stderr_logfile=/var/log/idle.err.log
  5. stdout_logfile=/var/log/idle.out.log
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

Output
idle: available

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

Output idle: added process group


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

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

sudo tail /var/log/idle.out.log

Output
Sat 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 步 - 管理程序

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

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

sudo supervisorctl

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

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

supervisor> help

Output
default commands (type help <topic>):
=====================================
add clear fg open quit remove restart start stop update
avail exit maintail pid reload reread shutdown status tail 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 界面。系统将要求您提供用户名和密码,如下所示:

2022-05-29-12-40-30%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png

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

2022-05-29-12-40-42%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK