supervisor系列:1、了解并安装supervisor


文章目录

1. 前言

supervisor简单来说是用于类unix系统的进程管理系统,和我们之前接触的perp类似,但是supervisor是用python写的,需要python环境支持,因此可以在树莓派等板子上使用,不太适合更小的嵌入式Linux系统。

对于进程管理,我们可以简单理解为原本各个进程的后台运行和异常挂掉后的拉起统一由该进程管理系统来处理,在这样的进程管理框架下我们不需要再对各个进程开发守护进程以及进程监控脚本等,只需要配置到进程管理系统下即可。当然,不同的进程管理系统可能有一些特色,这里我们不过多讨论。

官网地址:​​http://supervisord.org/​

接下来我们这里针对官网中的说明在Ubuntu上安装并总结。

2. supervisor概述

Supervisor 是一个客户端/服务器系统,允许其用户监视和控制类UNIX操作系统上的许多进程。它的灵感来自以下内容:

  • 便利性
    为每个单独的进程都写rc.d脚本是不方便的。rc.d脚本是进程初始化/自动启动/管理的一种最常见的形式,但是编写和维护他们是痛苦的。此外,rc.d脚本不能自动重新启动崩溃的进程,许多程序在崩溃时也不能正确地重新启动自己。supervisor将进程作为其子进程启动,并且可以在其崩溃后自动重启。还可以配置为在自己启动时调用进程。
  • 准确性
    在Unix上获取进程正确的启动/关闭状态通常很难。Pidfiles经常撒谎。supervisor以子进程的形式启动进程,因此它总是可以它的子进程的正确的启动/关闭状态并且可以方便的查询这些数据。
  • 授权
    需要控制进程状态的用户通常只需要这么做。他们不需要或不希望对运行进程的机器做全面的shell访问。监听“low”TCP端口的进程通常需要以root用户启动或者重启(一个Unix误功能)。通常情况下允许普通用户去停止或者重新启动这样的进程是完全没有问题的,但是向他们提供shell权限是不切实际的,并且向他们提供root权限或者sudo权限也是不可能的。向他们解释这个问题的原因也很困难。如果supervisor以root权限启动,就可以运行普通用户控制这些进程,而不需要向他们解释复杂的问题。supervisorctl运行对机器进行非常有限的访问,本质上允许用户查看进程状态并通过简单的shell或者网页用户界面发布停止、开启、重启指令来控制被supervisor控制的子进程。
  • 进程组
    进程通常需要子组中启动和停止,有时甚至按照优先级顺序执行。通常很难向让人们解释如何做到这一点。supervisor运行您为进程分配优先级,并且允许用户通过supervisorctl客户端发出命令,比如"start all"和"restart all",这将按照预先分配的优先级顺序启动它们。此外,流程可以分组为"process groups",一组逻辑相关的进程可以作为一个单元停止和启动。

3. 特点

  • 简单的
    Supervisor是通过一个简单的ini风格的配置文件配置的,很容易学习。它提供了许多单个进程选项,使您的生活更轻松,比如重新启动失败的进程和自动日志循环。
  • 集中的
    Supervisor为您提供了一个开始、停止和监控进程的地方。进程可以单独控制也可以分组控制。您可以配置supervisor提供本地或远程命令行和web界面。
  • 高效的
    Supervisor通过fork/exec启动紫禁城,子进程不被守护。当进程终止时,操作系统会立即向supervisor发出信号,这与一些依赖麻烦的PID文件和定期轮询重新启动失败进程的解决方案不同。
  • 可扩展
    Supervisor有一个简单的事件通知协议,任何语言编写的程序都可以使用该协议来监视它,以及一个用于控制的XML-RPC接口。它还使用python开发人员可以利用的扩展点构建。
  • 兼容的
    supervisor工作在除了Windows之外的所有东西上。它在Linux、Mac OS X、Solaris和FreeBSD上进行了测试和支持。它完全是用Python编写的,所以安装不需要C编译器。
  • 久经考验
    尽管Supervisor现在开发得很活跃,但它并不是新软件。Supervisor已经存在很多年了,并且已经在很多服务器上使用。

4. Supervisor组成

  • supervisord
    主管的服务部分被命名为​​supervisord​​。它负责在自己调用时启动子程序,响应来自客户机的命令,重新启动崩溃或退出的子进程,记录子进程的stdout和stderr输出,并生成和处理与子进程生命周期中各点对应的“事件”。
    服务进程使用一个配置文件,通常位于​​/etc/supervisor.conf​​中。这个配置文件是一个“Windows-INI”风格的配置文件。通过适当的文件系统权限确保该文件的安全非常重要,因为它可能包含未加密的用户名和密码。
  • supervisorctl
    管理器的命令行客户端部分命名为​​supervisorctl​​。它提供了一个shell式的接口来实现由​​supervisord​​提供的功能。从​​supervisorctl​​,用户可以连接到不同的​​supervisord​​进程(一次一个),获得子进程控制的状态,停止和启动子进程,并获得一个​​supervisord​​正在运行的进程列表。
    命令行客户端通过UNIX域套接字或internet (TCP)套接字与server进行通信。服务端可以断言客户端的用户在允许其执行命令之前应该提供身份验证凭据。客户端进程通常使用与服务端相同的配置文件,但是任何包含​​[supervisorctl]​​部分的配置文件都可以工作。
  • Web Server
    一个(稀疏的,简单的)web用户界面具有类似于​​supervisorctl​​的功能,可以通过浏览器访问,如果你针对一个互联网套接字启动​​supervisord​​。激活配置文件的​​[inet_http_server]​​部分后,通过web界面访问服务器URL(如​​http://localhost:9001/​​)来查看和控制进程状态。
  • XML-RPC Interface
    服务于网页用户界面的相同HTTP服务器提供XML-RPC接口,该接口可用于询问和控制管理程序及其运行。参见​​XML-RPC API​​文档。

5. 平台要求

Supervisor已经经过测试,已知可以在Linux (Ubuntu 18.04), Mac OS X (10.4/10.5/10.6), Solaris (10 for Intel)和FreeBSD 6.1上运行。它很可能在大多数UNIX系统上工作得很好。

Supervisor将不会在任何版本的Windows下运行。

Supervisor适用于Python 3 3.4或更高版本,以及Python 2 2.7版本。

6. 安装

6.1 有网络的系统下安装

  • 有pip

Supervisor可安装pip安装:

pip install

根据系统Python的权限,您可能需要是root用户才能使用pip成功安装Supervisor。

你也可以通过pip在virtualenv中安装supervisor。

  • 没有pip

如果您的系统没有安装pip,则需要下载Supervisor发行版并手动安装它。当前和以前的Supervisor版本可以从PyPi下载。解包后,运行python setup.py install。这需要上网。它将下载并安装Supervisor所依赖的所有发行版,并最终安装Supervisor本身。

注意:

根据系统Python的权限,您可能需要是根用户才能成功调用​​Python setup.py install​​。

6.2 没有网络的系统下安装

如果您想要安装Supervisor的系统没有Internet访问权限,那么您需要进行略微不同的安装。因为​​pip​​​和​​python setup.py​​安装都依赖于互联网访问来执行相关软件的下载,所以除非安装了依赖项,否则两者都不能在没有互联网访问的机器上工作。若要安装到未联网的机器上,请在联网的机器上获取以下依赖项:

Setuptools(最新)来自​​https://pypi.org/pypi/setuptools/​

将这些文件复制到可移动媒体中,并将它们放在目标机器上。按照指令将它们安装到目标机器上。这通常只是意味着解包每个文件并在解包目录中调用​​python setup.py install​​​。最后,运行supervisor的​​python setup.py install​​。

注意:

根据系统Python的权限,您可能需要是根用户才能为每个包成功调用​​Python setup.py install​​。

6.3 安装分发包

一些Linux发行版提供了一个可以通过系统包管理器安装的Supervisor版本。这些包是由第三方制作的,而不是由Supervisor开发人员制作的,并且通常包含针对Supervisor的特定于发行版的更改。

使用发行版的包管理工具来检查可用性;例如,在Ubuntu上可以运行​​apt-cache show supervisor​​​,在CentOS上可以运行​​yum info supervisor​​。

Supervisor的分发包的一个特性是,它们通常将集成到分发的服务管理基础结构中,例如,当系统启动时,允许supervisor自动启动。

注意:

Supervisor的分发包可能会大大落后于官方发布给PyPI的Supervisor包。例如,Ubuntu 12.04(发布于2012年4月)提供了一个基于Supervisor 3.0a8(发布于2010年1月)的软件包。延迟通常是由给定发行版设置的软件发布策略引起的。

注意:

用户报告说Ubuntu 16.04的Supervisor发行包与以前的版本有不同的行为。在Ubuntu 10.04、12.04和14.04上,安装该包将把系统配置为在系统启动时启动supervisor。在Ubuntu 16.04上,这在最初的版本中并没有实现。这个包后来被修正了。更多信息请参见Ubuntu Bug #1594740。

6.4 创建一个配置文件

一旦Supervisor安装完成,运行​​echo_supervisord_conf​​。这将打印一个“示例”Supervisor配置文件到终端的标准输出。

看到文件回显到终端后,将命令重新调用为​​echo_supervisord_conf > /etc/supervisord.conf​​。如果您没有root访问权限,这将无法工作。

如果您没有root访问权限,或者您宁愿不放置​​supervisord.conf​​​文件到​​/etc/supervisord.conf​​​,您可以将其放置在当前目录中(​​echo_supervisord_conf > supervisord.conf​​​)并使用​​-c​​标志启动supervisord,以指定配置文件的位置。

举个例子,​​supervisord -c supervisord.conf​​​。在这种情况下,使用-c标志实际上是多余的,因为在搜索任何其他位置的文件之前,supervisord会在当前目录中搜索supervisord.conf,但它会工作。有关-c标志的更多信息,请参见​​Running Supervisor​​。

一旦您的文件系统上有了一个配置文件,您就可以开始根据自己的喜好修改它。

总体上写一个简单的脚本即可:

#!/bin/bash

sudo -s
pip install supervisor
echo_supervisord_conf
echo_supervisord_conf > /etc/supervisor.conf
ps -ef | grep supervisor
supervisord -c /etc/supervisor.conf
ps -ef | grep

当然,前提是安装好了python和pip。