介绍
在许多VPS环境中,通常情况下,您将有许多小程序要永久运行,无论是小shell脚本,Node.js应用程序还是任何大型包。
通常,您可以为这些程序中的每一个编写一个初始化脚本,但是这可能会很快耗费时间来管理,并且对于较新的用户并不总是特别透明。
主管是一个进程管理器,这使得管理多个长期运行的程序通过提供一致的接口,通过它们可以监测和控制的简单的任务。
本教程假定您熟悉命令行,安装软件包和基本服务器管理。
安装
在Ubuntu和Debian上安装Supervisor非常简单,因为预配置的软件包已经存在于两个版本库中。
以root用户身份运行以下命令安装Supervisor软件包:
apt-get install supervisor
一旦完成,管理程序守护程序应该已经启动,因为预构建的软件包附带一个初始化脚本,这也将确保在系统重新引导后重新启动管理程序。 你可以通过运行:
service supervisor restart
现在我们安装了Supervisor,我们可以看看添加我们的第一个程序。
添加程序
新程序通过配置文件提供给Supervisor,它通知它运行的可执行文件,任何环境变量以及如何处理输出。
注:主管下运行的所有程序必须在运行非daemonising模式 (有时也称为“前景模式”)。 如果默认情况下,程序在启动时分叉并返回,则可能需要查看程序的手册以找到启用此模式的选项,否则Supervisor将无法正确确定程序的状态。
对于本文起见,我们假设我们有我们希望保持持续运行,我们已经保存在/usr/local/bin/long.sh,看起来像下面这样的shell脚本:
#!/bin/bash while true do # Echo current date to stdout echo `date` # Echo 'error!' to stderr echo 'error!' >&2 sleep 1 done
chmod +x /usr/local/bin/long.sh
在实际意义上,这个脚本显然是毫无意义的,但它将允许我们覆盖Supervisor配置的基本原理。
为监事程序的程序配置文件中的/etc/supervisor/conf.d目录中找到,通常与每个文件一个程序和扩展的.conf。 我们的脚本一个简单的配置,保存在/etc/supervisor/conf.d/long_script.conf,看起来就像这样:
[program:long_script] command=/usr/local/bin/long.sh autostart=true autorestart=true stderr_logfile=/var/log/long.err.log stdout_logfile=/var/log/long.out.log
我们将看看每行的意义,以及一些对您的程序可能需要的调整:
[program:long_script] command=/usr/local/bin/long.sh
配置开始于定义名为“long_script”的程序和程序的完整路径:
autostart=true autorestart=true
接下来的两行定义了在某些条件下脚本的基本自动行为。
自动启动选项告诉主管,这个程序应启动在系统引导时。 将此设置为false将需要在任何系统关闭后手动启动命令。
自动重新定义主管应如何退出,有三个选项事件管理程序:
- false'告诉Supervisor退出后不要重新启动程序
- 'true'告诉Supervisor在退出后总是重新启动程序
- “意外”告诉Supervisor只有重新启动程序,如果它退出与意外的错误代码(默认情况下除了代码0或2)。
stderr_logfile=/var/log/long.err.log stdout_logfile=/var/log/long.out.log
最后两行定义程序的两个主日志文件的位置。 正如选项名称的建议,输出和错误将分别定向到stdout_logfile和stderr_logfile位置。 在我们启动程序之前,指定的指定目录必须存在,因为Supervisor不会尝试创建任何缺少的目录。
我们在这里创建的配置是一个超级程序最小合理的模板。 该文件列出了可用于微调如何执行该计划更多的可选配置选项。
一旦我们的配置文件被创建并保存,我们可以通过supervisorctl命令告知我们新计划的主管。 首先,我们告诉主管寻找在/etc/supervisor/conf.d目录中任何新的或更改的程序配置:
supervisorctl reread
然后告诉它执行任何更改:
supervisorctl update
每当对任何程序配置文件进行更改时,运行前面的两个命令将使更改生效。
在这一点上,我们的程序现在应该运行,我们可以通过查看输出日志文件来检查这种情况:
$ tail /var/log/long.out.log Sat Jul 20 22:21:22 UTC 2013 Sat Jul 20 22:21:23 UTC 2013 Sat Jul 20 22:21:24 UTC 2013 Sat Jul 20 22:21:25 UTC 2013 Sat Jul 20 22:21:26 UTC 2013 Sat Jul 20 22:21:27 UTC 2013 Sat Jul 20 22:21:28 UTC 2013 Sat Jul 20 22:21:29 UTC 2013 Sat Jul 20 22:21:30 UTC 2013 Sat Jul 20 22:21:31 UTC 2013
成功!
管理程序
一旦我们的程序运行,毫无疑问将是一个时间,当我们想停止,重新启动,或看到他们的状态。 上面我们首先使用的supervisorctl程序也有一个交互模式,通过它我们可以发出命令来控制我们的程序。
要进入交互模式,请启动没有参数的supervisorctl:
$ supervisorctl long_script RUNNING pid 12614, uptime 1:49:37 supervisor>
启动时,supervisorctl将首先打印所有程序的状态和正常运行时间,然后显示命令提示符。 输入help将显示所有我们可以利用可用的命令:
supervisor> help default commands (type help ): ===================================== add clear fg open quit remove restart start stop update avail exit maintail pid reload reread shutdown status tail version要启动以简单的方式,我们就可以启动 , 停止和重新启动与相关的命令后面的程序名的程序:
supervisor> stop long_script long_script: stopped supervisor> start long_script long_script: started supervisor> restart long_script long_script: stopped long_script: started
使用tail命令,我们可以看到在我们的节目输出和错误日志的最新条目:
supervisor> tail long_script Sun Jul 21 00:36:10 UTC 2013 Sun Jul 21 00:36:11 UTC 2013 Sun Jul 21 00:36:12 UTC 2013 Sun Jul 21 00:36:13 UTC 2013 Sun Jul 21 00:36:14 UTC 2013 Sun Jul 21 00:36:15 UTC 2013 Sun Jul 21 00:36:17 UTC 2013 supervisor> tail long_script stderr error! error! error! error! error! error! error!
使用状态我们可以再次查看在进行任何更改后的每个程序的当前执行状态:
supervisor> status long_script STOPPED Jul 21 01:07 AM
最后,一旦我们完成后,我们可以使用Ctrl-C或者输入退出到退出提示supervisorctl:
supervisor> quit
就是这样! 你掌握了通过Supervisor管理持久化程序的基础知识,并将它扩展到你自己的程序应该是一个相对简单的任务。 如果您有任何问题或进一步的建议,一定要留在评论部分。