Linux服务:使用Supervisor管理进程 – 运维那点事

Linux服务:使用Supervisor管理进程 – 运维那点事

一、简介

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

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

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

Supervisor管理的进程,进程组信息,全部都写在一个ini格式的文件里就OK了(格式可以自定义,我一般喜欢用.conf后缀)。而且,我们管理supervisor的时候的可以在本地进行管理,也可以远程管理,而且supervisor提供了一个web界面,我们可以在web界面上监控,管理进程。 当然了,本地,远程和web管理的时候,需要调用supervisor的xml_rpc接口。

二、安装

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

通过easy_install安装

$ yum install pythonsetuptools

$ easy_install supervisor

 或者,通过pip安装

三、结构

Supervisord

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

Supervisorctl

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

Web server

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

XML-RPC interface

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

三、基本使用

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的默认配置的内容。其可以用来生成一份默认的配置文件:

$ echo_supervisord_conf > /etc/supervisord.conf

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

[include]

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

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

先在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

$ cat /etc/supervisord.d/memcached.conf

[program:memcached]

# 启动程序的命令;

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

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

autostart = true

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

autorestart = true

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

startsecs = 5

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

startretries = 3

# 启动程序的用户;

user = nobody

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

redirect_stderr = true

# 标准日志输出;

stdout_logfile=/data/log/memcached/outmemcache.log

# 错误日志输出;

stderr_logfile=/data/log/memcached/errmemcache.log

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

stdout_logfile_maxbytes = 20MB

# 标准日志文件备份数;

stdout_logfile_backups = 20

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

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

process_name=%(process_num)s

numprocs=3

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

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

$ supervisord c /etc/supervisor/supervisord.conf

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

查看Supervisor是否已经启动

$ ps ef | grep supervisor | grep v grep

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

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

$ supervisorctl status

memcached                  RUNNING   pid 1230, uptime 0:04:39

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

四、使用supervisorctl命令

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

  • 命令式

1. 查询各进程运行状态

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

supervisorctl start memcached

supervisorctl stop memcached

supervisorctl restart memcached

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

supervisorctl start groupworker

supervisorctl stop groupworker

supervisorctl restart groupworker

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

supervisorctl start all

supervisorctl stop all

supervisorctl restart all

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

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

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

  • 交互式

$ 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监控了。

/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有很丰富的功能,还有其他很多项配置,可以在官方文档获取更多信息:http://supervisord.org/index.html


如果您觉得本站对你有帮助,那么可以支付宝扫码捐助以帮助本站更好地发展,在此谢过。