介绍
在许多VPS环境中,通常会出现一些你想要持续运行的小程序,无论是小壳脚本、Node.js应用程序还是任何大型软件包。
通常情况下,外部软件包附有一个 unit file 文件,允许它们由 init 系统管理,如 systemd
,或包装为 docker图像,可由容器引擎管理。
Supervisor是一个流程管理器,提供了一个独特的界面来管理和监控许多长期运行的程序. 在本教程中,您将安装Supervisor在Linux服务器上,并学习如何管理多个应用程序的Supervisor配置。
前提条件
要完成本指南,您将需要:
- Linux 服务器和具有 sudo 特权的非根用户. 您可以在我们的 Ubuntu 20.04 初始服务器设置指南中了解有关如何设置具有这些特权的用户的更多信息。
步骤1 - 安装
首先,更新您的包源并安装 Supervisor:
1sudo apt update && sudo apt install supervisor
管理员服务在安装后自动运行,您可以检查其状态:
1sudo systemctl status supervisor
你应该得到以下的输出:
1[secondary_label 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
现在我们已经安装了 Supervisor,我们可以考虑添加我们的第一个程序。
步骤 2 - 添加一个程序
与 Supervisor 合作的最佳做法是为它处理的每个程序编写一个配置文件。
<$>[note] 所有在 Supervisor 中运行的程序都必须运行在 非 demonising 模式(有时也称为 'foreground 模式)中(如果默认情况下,您的程序在运行后自动返回壳,那么您可能需要查阅程序的手册以找到启用此模式的选项,否则 Supervisor 将无法正确确定该程序的状态。 <$>
为了展示 Supervisor 的功能,我们将创建一个 shell 脚本,它只会每秒产生一些可预测的输出,但将在背景中连续运行,直到它被手动停止。
1nano ~/idle.sh
添加以下内容:
1[label ~/idle.sh]
2#!/bin/bash
3while true
4do
5 # Echo current date to stdout
6 echo `date`
7 # Echo 'error!' to stderr
8 echo 'error!' >&2
9 sleep 1
10done
保存并关闭文件. 如果您正在使用nano
,请按Ctrl+X
,然后在提示时按Y
和Enter
。
接下来,让你的脚本可执行:
1chmod +x ~/idle.sh
对 Supervisor 程序的每个程序配置文件位于 /etc/supervisor/conf.d 目录中,通常每个文件运行一个程序,并在
.conf. 中结束,我们将为此脚本创建一个配置文件,如
/etc/supervisor/conf.d/idle.conf:
1sudo nano /etc/supervisor/conf.d/idle.conf
添加这些内容:
1[label /etc/supervisor/conf.d/idle.conf]
2command=/home/ubuntu/idle.sh
3autostart=true
4autorestart=true
5stderr_logfile=/var/log/idle.err.log
6stdout_logfile=/var/log/idle.out.log
我们将根据这条路线进行审查:
1command=/home/ubuntu/idle.sh
配置从定义一个名为idle
的程序开始,并为该程序提供完整的路径:
1autostart=true
2autorestart=true
接下来的两个行在某些条件下定义了脚本的自动行为。
自动启动
选项告诉 Supervisor 该程序应该在系统启动时启动. 将此设置为 false 需要在任何系统关机后手动启动。
- 'false' 告诉 Supervisor 不要在退出程序后重新启动程序。
- 'true' 告诉 Supervisor 在退出程序后始终重新启动程序。
- 'unexpected' 告诉 Supervisor 仅在退出程序时重新启动程序(默认情况下除 0 或 2 代码外)。
1stderr_logfile=/var/log/idle.err.log
2stdout_logfile=/var/log/idle.out.log
最后两行定义了程序的两个主要日志文件的位置。如选项名称所示,stdout 和 stderr 将被引导到stdout_logfile
和stderr_logfile
的位置,分别。指定的目录必须已经存在,因为 Supervisor 不会尝试创建任何缺失的目录。
我们在这里创建的配置是 Supervisor 程序的最小模板。 Supervisor 文档列出了许多可选的配置选项,以调节程序的运行方式。
一旦我们的配置文件被创建和保存,我们可以通过supervisorctl
命令通知 Supervisor 我们的新程序。
1sudo supervisorctl reread
1[secondary_label Output]
2idle: available
然后告诉它通过任何更改:
1sudo supervisorctl update
1[secondary_label Output]
2idle: added process group
每当你对任何程序配置文件进行更改时,运行前两个命令将使更改生效。
在此时,我们的程序现在应该运行。
1sudo tail /var/log/idle.out.log
1[secondary_label Output]
2Sat Nov 20 22:21:22 UTC 2021
3Sat Nov 20 22:21:23 UTC 2021
4Sat Nov 20 22:21:24 UTC 2021
5Sat Nov 20 22:21:25 UTC 2021
6Sat Nov 20 22:21:26 UTC 2021
7Sat Nov 20 22:21:27 UTC 2021
8Sat Nov 20 22:21:28 UTC 2021
9Sat Nov 20 22:21:29 UTC 2021
10Sat Nov 20 22:21:30 UTC 2021
11Sat Nov 20 22:21:31 UTC 2021
接下来,我们将涵盖一些其他使用 Supervisor。
步骤三:管理计划
除了运行程序之外,您还需要停止、重新启动或查看其状态。我们在 Step 2 中使用的 supervisorctl 程序还具有交互式模式,我们可以使用它来控制我们的程序。
要进入互动模式,运行 supervisorctl 没有参数:
1sudo supervisorctl
1[secondary_label Output]
2idle RUNNING pid 12614, uptime 1:49:37
3supervisor>
supervisorctl
将最初打印所有配置的程序的状态和运行时间,然后是命令提示,输入帮助
将显示所有可用的命令:
1supervisor> help
1[secondary_label Output]
2default commands (type help <topic>):
3=====================================
4add clear fg open quit remove restart start stop update
5avail exit maintail pid reload reread shutdown status tail version
您可以启动
或停止
一个程序,使用相关命令,然后是程序名称:
1supervisor> stop idle
1[secondary_label Output]
2idle: stopped
1supervisor> start idle
1[secondary_label Output]
2idle: started
使用尾巴
命令,您可以查看您的程序的 stdout 和 stderr 日志中最新的条目:
1supervisor> tail idle
1[secondary_label Output]
2Sun Nov 21 00:36:10 UTC 2021
3Sun Nov 21 00:36:11 UTC 2021
4Sun Nov 21 00:36:12 UTC 2021
5Sun Nov 21 00:36:13 UTC 2021
6Sun Nov 21 00:36:14 UTC 2021
7Sun Nov 21 00:36:15 UTC 2021
8Sun Nov 21 00:36:17 UTC 2021
1supervisor> tail idle stderr
1[secondary_label Output]
2error!
3error!
4error!
5error!
6error!
7error!
8error!
使用状态
,您可以在做任何更改后再次查看每个程序的当前运行状态:
1supervisor> status
1[secondary_label Output]
2idle STOPPED Nov 21 01:07 AM
最后,您可以使用 Ctrl + C 退出 supervisorctl 或通过输入quit
到提示中:
1supervisor> quit
结论
在本教程中,您了解了如何安装和管理 Supervisor. 如前所述, Supervisor 根据现代标准非常轻,但它仍然保持良好的维护,并且可以成为较小的部署的有用工具。
如果您正在运行多个需要在网络上访问的小型应用程序,您可能还想阅读有关 配置 Nginx 作为反向代理程序,这是小型可重复使用部署的另一个基本组成部分。