现在的位置: 首页Linux, python>正文
linux进程管理Supervisord
2013年10月06日 Linux, python 暂无评论 ⁄ 被围观 10,274 view+

Supervisord是用Python实现的一款非常实用的进程管理工具,类似于monit

Monit和Supervisord的一个比较大的差异是Supervisord管理的进程必须由Supervisord来启动,Monit可以管理已经在运行的程序。

Supervisord还要求管理的程序是非Daemon程序,Supervisord会帮你把它转成Daemon程序,因此如果用Supervisord来管理Nginx的话,必须在Nginx的配置文件里添加一行设置Daemon off让Nginx以非Daemon方式启动。

在工作中经常会碰到要写一些守护进程,简单做法放入后台:

#nohup python xxx.py &

偶尔这么做还可以接受,如果一堆这样的呢?

当然还有一个问题,就是各种服务,对应的命令或者路径都不太一致,比如Apache、MySQL或者其他自行编译的工具。

如果可以统一管理这些应用,是不是很哈皮?

按照惯例现Google一把,不失所望找到一个神奇的利器。supervisor!

supervisor地址:http://supervisord.org,官方标语就是:一个进程管理工具。

一、Supervisord安装

Supervisord可以通过sudo easy_install supervisor安装,当然也可以通过Supervisord官网下载后setup.py install安装。也可以通过其他包管理来安装,比如apt/yum等。

我的机器是CentOS所以用yum安装:

yum install supervisor

安装好以后,有两个可执行文件和一个配置文件(平台差异,可能路径不一致):

/usr/bin/supervisord             --  supervisor服务守护进程
/usr/bin/supervisorctl           --  supervisor服务控制程序,比如:status/start/stop/restart xx 等
/etc/supervisor/supervisord.conf --  配置文件,定义服务名称以及接口等等

下面来一个示例,用web.py写一个hello的程序:

import web
urls = (
    '/(.*)','hello'
)
app = web.application(urls, globals())
class hello:
    def GET(self, name):
        return 'hello: ' + name
if __name__ == '__main__':
    app.run()

这个时候可以直接启动这个程序了,下面来配置supervisor,加入管理。修改supervisord.conf,加入如下片段:

[program:hello]
command=python /home/smallfish/hello.py
autorstart=true
stdout_logfile=/home/smallfish/hello.log

上面的意思应该很容易懂,program后面跟服务的名称,command是程序的执行路径,autorstart是表示自动启动,stdout_logfile是捕获标准输出。

二、Supervisor配置

Supervisord默认的配置文件路径为/etc/supervisord.conf,通过文本编辑器修改这个文件,下面是一个示例的配置文件:

#vi /etc/supervisord.conf
[unix_http_server]
file = /var/run/supervisor.sock
chmod = 0777
chown= root:felinx

[inet_http_server]
# Web管理界面设定
port=9001
username = admin
password = yourpassword

[supervisorctl]
#必须和'unix_http_server'里面的设定匹配
serverurl = unix:///var/run/supervisord.sock

[supervisord]
logfile=/var/log/supervisord/supervisord.log    #(main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB       #(max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10          #(num of main logfile rotation backups;default 10)
loglevel=info               #(log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid	    #(supervisord pidfile;default supervisord.pid)
nodaemon=true              #(start in foreground if true;default false)
minfds=1024                #(min. avail startup file descriptors;default 1024)
minprocs=200                #(min. avail process descriptors;default 200)
user=root                #(default is current user, required if root)
childlogdir=/var/log/supervisord/            #('AUTO' child log dir, default $TEMP)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

#管理的单个进程的配置,可以添加多个program
[program:chatdemon]
command=python /home/felinx/demos/chat/chatdemo.py
autostart = true
startsecs = 5
user = felinx
redirect_stderr = true	#这对这个program的log的配置,上面的logfile_maxbytes是supervisord本身的log配置
stdout_logfile_maxbytes = 20MB
stdoiut_logfile_backups = 20
stdout_logfile = /var/log/supervisord/chatdemo.log

#配置一组进程,对于类似的program可以通过这种方式添加,避免手工一个个添加
[program:groupworker]
command=python /home/felinx/demos/groupworker/worker.py
numprocs=24
process_name=%(program_name)s_%(process_num)02d
autostart = true
startsecs = 5
user = felinx
redirect_stderr = true
stdout_logfile = /var/log/supervisord/groupworker.log

三、Supervisor管理

Supervisord安装完成后有两个可用的命令行supervisor和supervisorctl,命令使用解释如下:

  • supervisord,初始启动Supervisord,启动、管理配置中设置的进程。
  • supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:chatdemon]里配置的值,这个示例就是chatdemon。
  • supervisorctl start programxxx,启动某个进程
  • supervisorctl restart programxxx,重启某个进程
  • supervisorctl stop groupworker: ,重启所有属于名为groupworker这个分组的进程(start,restart同理)
  • supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
  • supervisorctl reload,载入最新的配置文件,停止原有进程并按新的配置启动、管理所有进程。
  • supervisorctl update,根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启。
  • 注意:显示用stop停止掉的进程,用reload或者update都不会自动重启。

OK,基本的操作就是类似这个了,仔细看supervisord.conf文件里会发现有一段[unix_http_server]的配置,默认是9001端口,可以输入用户名和密码,主要用于Basic Auth认证用的。填写一下,然后重启supervisor服务,打开浏览器输入:http://localhost:9001,如图:

四、Tornado + Supervisor 在生产环境下的部署方法

vi /etc/supervisord.conf 最后面加上:

[program:tornado_poll]
#要执行的命令,这里的“%(process_num)02d”会用2位精度的进程号替换,例如,第一个进程是8001,第二个进程是8002,以此类推,下同。
command=python /home/wwwroot/app/app.py 80%(process_num)02d
;启动的进程的名字,这里的名字只是supervisor内部是别用,与你所启动程序的进程名无关
process_name expr (default %(program_name)s)
process_name=%(program_name)s-80%(process_num)02d
numprocs=4                     #启动几个tornado进程
directory=/home/wwwroot/app    #运行前cd到此目录
autostart=true                			#supervisord守护程序启动时自动启动tornado
autorestart=true              		#supervisord守护程序重启时自动重启tornado
user=www-data                   		#运行程序前su到此用户
redirect_stderr=true          		#将stderr重定向到stdout
stdout_logfile=/home/wwwroot/logs/tornado-80%(process_num)02d.log
stdout_logfile_maxbytes=500MB
stdout_logfile_backups=50
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
loglevel=warn

运行:

#supervisord
sendmail:sendmail_00             RUNNING    pid 2499, uptime 5:47:52
supervisor>在这里可以输入控制命令

可以看到,上面显示了现在正在运行的守护进程的信息。

可能的问题:

* Starting Supervisor daemon manager......
Error: Another program is already listening on a port that one of our HTTP servers is configured to use.  Shut this program down first before starting supervisord.

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

......fail!

解决办法:unlink supervisor.sock文件的位置

来源:http://www.qixing318.com/article/use-supervisord-management-process.html

给我留言

留言无头像?


×
腾讯微博