Linux服务:使用Supervisor管理进程

1、简介

因为基本每一个公司都会用到supervisor这个进程管理工具,这里简单阐述一下。html

Supervisor (http://supervisord.org) 是一个用Python写Linux下的进程集中管理工具,将非daemon程序变成deamon方式运行,对于daemon程序则不能监控。能够很方便地对管理的进程进行启动、重启、关闭操做(不只仅是Python进程)。除了对单个进程的控制,还能够同时启动、关闭多个进程,好比很不幸的服务器出问题致使全部应用程序都被杀死,此时能够用supervisor同时启动全部应用程序而不是一个一个地敲命令启动。python

除了能够方便地进行进程集中管理外,还有一个大的功能就是对程序进行监控,当程序退出时,能够自动拉起程序。其原理就是supervisor管理进程是经过fork/exec的方式把这些被管理的进程,看成supervisor的子进程来启动,被管理进程做为supervisor的子进程,当子进程挂掉的时候,父进程能够准确获取子进程挂掉的信息的,因此固然也就能够对挂掉的子进程进行自动重启了,固然重启仍是不重启,也要看你的配置文件里面有木有设置autostart=true了。ios

Supervisor管理的进程,进程组信息,所有都写在一个ini格式的文件里就OK了(格式能够自定义,我通常喜欢用.conf后缀)。并且,咱们管理supervisor的时候的能够在本地进行管理,也能够远程管理,并且supervisor提供了一个web界面,咱们能够在web界面上监控,管理进程。 固然了,本地,远程和web管理的时候,须要调用supervisor的xml_rpc接口。web

2、安装

Supervisor是基于python开发的,安装Supervisor前,须要先安装python,Supervisor能够经过pip或者easy_install安装。shell

经过easy_install安装服务器

 或者,经过pip安装ide

 

3、结构

Supervisordmemcached

主进程,负责管理进程的server,它会根据配置文件建立指定数量的应用程序的子进程,管理子进程的整个生命周期,对crash的进程重启,对进程变化发送事件通知等。同时内置web server和XML-RPC Interface,轻松实现进程管理。工具

Supervisorctlui

管理client,用户经过命令行发送消息给supervisord,能够查看进程状态,加载配置文件,启停进程,查看进程标准输出和错误输出,远程操做等。

Web server

Superviosr提供了web server功能,可经过web控制进程。

XML-RPC interface

XML-RPC接口,提供XML-RPC服务来对子进程进行管理,监控。

3、基本使用

Supervisor的配置文件命名为supervisord.conf,它为supervisord(Supervisor 的主服务命令) 和 supervisorctl(Supervisor 的监控管理命令) 提供配置选项设置。 Supervisor并不规定配置文件supervisord.conf的存放位置。Supervisor服务启动的时候默认会在:

  • $CWD/supervisord.conf
  • $CWD/etc/supervisord.conf
  • /etc/supervisord.conf

这几个目录位置查找配置文件supervisord.conf,用yum安装的supervisor默认会生成/etc/supervisord.conf配置文件。Supervisor也提供参数 “-c” 来指定配置文件的目录路径。

若是你是编译安装,或其余系统,能够在终端输入”echo_supervisord_conf”命令查看Supervisor的默认配置的内容。其能够用来生成一份默认的配置文件:

Supervisor的配置文件生成以后,如今能够添加咱们要管理的进程的配置文件。能够把全部配置项都写到supervisord.conf文件里,但并不推荐这样作,而是经过include的方式把不一样的程序(组)写到不一样的配置文件里。要确保你的supervisord.conf配置文件中include包含了你自定义的配置文件包含进来,以下:

下面咱们修改配置文件将memcached进程以deamon方式拉起(memcached进程也能够是一个shell或python脚本),并对此进行监控。

先在supervisor目录下建立一个配置文件,以下

一份配置文件至少须要一个 [program:x] 部分的配置,来告诉supervisord 须要管理那个进程。[program:x]语法中的x表示program name,会在客户端(supervisorctl 或 web 界面)显示,在 supervisorctl 中经过这个值来对程序进行start、restart、stop等操做。日志文件要存放的文件夹要建立好。

使用supervisor还有一个更大的好处就是,能够快速开启多个进程,配置参数以下:

表示对同一个配置开启3个线程。

启动supervisor,就会拉起memcached进程。

ps:Supervisor启动后在/tmp目录会产生supervisord.log 、supervisord.pid 、supervisor.sock这三个文件,若是有问题能够查看日志。

查看Supervisor是否已经启动

查看业务进程是否已经被拉起

中止Supervisor(子进程也会被中止,也能够针对单个程序进行start、update、restart、stop操做)

 

4、使用supervisorctl命令

Supervisor可经过维护命令supervisorctl管理或经过web管理界面管理。维护命令supervisorctl有两种用法。一种是命令式,一种是交互式。

  • 命令式

1. 查询各进程运行状态

2. 启、停、重启业务进程,memcached为进程名,即[program:memcached]里配置的值

3. 重启全部属于名为groupworker这个分组的进程

4. 启、停、重启所有进程(不会载入最新的配置文件)

5. 从新加载配置文件,中止原有进程并按新的配置启动全部进程(注意:全部进程会中止并重启,线上操做慎重)

6. 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而被重启(注意:这才是线上能够操做的命令,不会重启原有进程)

注意:显示状态为stop中止掉的进程,用reload或者update都不会自动重启。

  • 交互式

 

 

5、故障处理

这几个故障都是我使用supervisor时遇到的坑,帮大家填上。

supervisor 比较适合监控业务应用,且只能监控前台程序,若是你的程序是以daemon的方式启动,那么执行:supervisor status 会提示:BACKOFF  Exited too quickly (process log may have details)。好比:memcached启动时加上-d选项就是之后台daemon启动,就不能使用supervisor监控了。

还有一个须要注意的,若是执行supervisor status时报错是:FATAL     Exited too quickly (process log may have details),要检查一下是否是由于添加了user = nobody致使执行权限的问题。

若是出现这个错误:

Error: .ini file does not include supervisord section

For help, use /usr/bin/supervisord -h

就是你的自定义的程序配置文件格式有问题(/etc/supervisor/conf.d/*.conf),好好检查了。

6、其余

1)能够本身编写脚本将Supervisor加入chkconfig中,随系统自动启动。 或者可使用现成的脚本: Supervisor initscripts。

2)除了supervisorctl 以外,还能够配置supervisrod启动web管理界面,这个web后台使用Basic Auth的方式进行身份认证。

3)除了单个进程的控制,还能够配置group,进行分组管理。常常查看日志文件,包括 supervisord的日志和各个 pragram 的日志文件,程序crash 或抛出异常的信息一半会输出到stderr,能够查看相应的日志文件来查找问题。

4)Supervisor有很丰富的功能,还有其余不少项配置,能够在官方文档获取更多信息:http://supervisord.org/index.html

相关文章
相关标签/搜索