由于基本每个公司都会用到

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

Supervisor (http://supervisord.org) 是一个用Python写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是Python进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor同时启动所有应用程序而不是一个一个地敲命令启动。Supervisor是一款Linux下的进程管理软件,最主要的两个功能是:

1)将非daemon程序变成deamon方式运行,对于daemon程序则不能监控。

2)对程序进行监控,当程序退出时,可以自动拉起程序。

安装

Supervisor是基于python开发的,安装Supervisor前,需要先安装python,Supervisor可以通过pip或者easy_install安装。

通过easy_install安装

1

2

   

[root@www ~]# yum install python-setuptools

[root@www ~]# easy_install supervisor

   

通过pip安装

1

   

[root@www ~]# pip install supervisor

   

基本使用(基于Debian,CentOS大同小异)

生成配置文件

Supervisor相当强大,提供了很丰富的功能,不过我们可能只需要用到其中一小部分。安装完成之后,可以编写配置文件,来满足自己的需求。为了方便,我们把配置分成两部分:supervisord(supervisor是一个C/S模型的程序,这是server端,对应的有client端:supervisorctl)和应用程序(即我们要管理的程序)。首先来看 supervisord 的配置文件。安装完 supervisor 之后,可以运行echo_supervisord_conf命令输出默认的配置项,也可以重定向到一个配置文件里:

1

2

   

[root@www ~]# mkdir -m 755 -p /etc/supervisor/conf.d/

[root@www ~]# echo_supervisord_conf > /etc/supervisor/supervisord.conf

   

基础应用

Supervisor的配置文件生成之后,现在可以添加我们要管理的进程的配置文件。可以把所有配置项都写到 supervisord.conf 文件里,但并不推荐这样做,而是通过include的方式把不同的程序(组)写到不同的配置文件里。要确保你的supervisord.conf配置文件中include包含了你自定义的配置文件包含进来,如下:

1

2

   

[include]

files = /etc/supervisor/conf.d/*.conf

   

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

1)现在supervisor目录下创建一个配置文件,如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

   

[root@www ~]# cat /etc/supervisor/conf.d/memcached.conf

[program:memcached]

command = /usr/bin/memcached -m 5120 -p 11211 -u nobody -l 0.0.0.0 -b 65535

  #启动程序的命令;

autostart = true

  #在supervisord启动的时候也自动启动;

autorestart = true

  #程序异常退出后自动重启;

startsecs = 5

  #启动5秒后没有异常退出,就当作已经正常启动了;

startretries = 3

  #启动失败自动重试次数,默认是3;

#user = nobody

  #开启进程使用哪个用户和组启动(这里memcached启动时指定了nobody用户所以就不用再指定了);

redirect_stderr = true

  #把stderr重定向到stdout,默认false;

stdout_logfile=/data/log/memcached/out-memcache.log

  #标准日志输出;

stderr_logfile=/data/log/memcached/err-memcache.log

  #错误日志输出;

stdout_logfile_maxbytes = 20MB

  #标准日志文件大小,默认50MB;

stdout_logfile_backups = 20

  #标准日志文件备份数;

   

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

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

1

2

   

process_name=%(process_num)s

numprocs=3

   

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

2)启动supervisor,就会拉起memcached进程

启动Supervisor

1

   

[root@www ~]# supervisord -c /etc/supervisor/supervisord.conf

   

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

查看Supervisor是否已经启动

1

2

   

[root@www ~]# ps -ef | grep supervisor | grep -v grep

root      1170     1  0 18:57 ?        00:00:00 /usr/bin/python /usr/bin/supervisord

   

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

1

2

   

[root@www ~]# supervisorctl status

memcached                  RUNNING   pid 1230, uptime 0:04:39

   

停止Supervisor(子进程也会被停止,也可以针对单个程序进行start、update、restart、stop操作)

1

   

[root@www ~]# supervisorctl shutdown

   

使用supervisorctl命令

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

命令式

1.查询各进程运行状态

1

   

supervisorctl status

   

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

1

2

3

   

supervisorctl start memcached

supervisorctl stop memcached

supervisorctl restart memcached

   

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

1

2

3

   

supervisorctl start groupworker

supervisorctl stop groupworker

supervisorctl restart groupworker

   

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

1

2

3

   

supervisorctl start all

supervisorctl stop all

supervisorctl restart all

   

5.重新加载配置文件,停止原有进程并按新的配置启动所有进程(注意:所有进程会停止并重启,线上操作慎重)

1

   

supervisorctl reload

   

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

1

   

supervisorctl update

   

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

交互式

1

2

3

4

5

6

7

8

9

10

11

12

13

14

   

[root@aaa ]# supervisorctl

memcached                       RUNNING   pid 1256, uptime 0:01:47

supervisor> stop memcached

memcached: stopped

supervisor> start memcached

memcached: started

supervisor> status

memcached                       RUNNING   pid 1258, uptime 0:00:04

supervisor> restart memcached

memcached: stopped

memcached: started

supervisor> status

memcached                       RUNNING   pid 1259, uptime 0:00:02

supervisor>

   

故障处理

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

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

1

   

/usr/bin/memcached -d -m 5120 -p 11211 -u nobody -l 0.0.0.0 -b 65535

   

还有一个需要注意的,如果执行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),好好检查了。

其他

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

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

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

4)Supervisor有很丰富的功能,还有其他很多项配置

本文出自https://www.ywnds.com/?p=3348