Yang Yubo's Life @ Refactoring

written on Thursday, May 14, 2009

用 Supervisor 管理后台守护进程

在虚拟主机中管理后台守护程序没有 VPS 那么方便, VPS 是可以使用 root 权限的, 但虚拟主机则不能.

要更方便的管理后台进程, 通常需要借助一些辅助工具. 常用的管理工具有 runit, daemontools 以及 Supervisor. 其中以 Supervisor 最为易用, 功能也很完善.

安装 Supervisor

Supervisor 是一个 Python 程序, 按照 官方文档安装 就可以了.

稍加注意的是, 虚拟主机用户需要安装到他的用户目录:

easy_install supervisor --prefix=$HOME

安装完成后, 确保 $HOME/bin 目录在 $PATH 环境变量中并已经生效.

使用方法

Supervisor 有两个可执行程序 -- supervisordsupervisorctl:

  • supervisord 是后台管理服务器, 用来依据配置文件的策略管理后台守护进程;
  • supervisorctl 用于管理员向后台管理程序发送 启动/重启/停止 等指令;

它们之间的关系就相当于 Apache 的 httpdapachectl.

创建工作目录和配置文件

首先需要创建一个 Supervisor 的工作目录, 如: $HOME/deploy/supervisor/, 用来存放错误日志输出, pid 文件, socket 文件, 配置文件等.

接着是创建 配置文件, 配置文件用来指示 Supervisor 有哪些进程需要管理, 以及管理策略.

我们把配置文件命名为 supervisord.conf (也可以是其它任何文件名, 但 Supervisor 默认自动在当前目录查找该文件, 用 supervisord.conf 会为以后管理提供方便):

[supervisord]
logfile = %(here)s/supervisord.log
loglevel = warn
pidfile = %(here)s/supervisord.pid
directory = %(here)s/
childlogdir = %(here)s/childlog

[unix_http_server]
file = <YOU-HOME-PATH>/deploy/supervisor/supervisord.sock

[rpcinterface:supervisor]
; This section is always necessary because supervisor uses RPC internally.
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
; Must match settings in 'unix_http_server'
serverurl = unix:///<YOU-HOME-PATH>/deploy/supervisor/supervisord.sock

[program:blog]
command = <YOU-HOME-PATH>/deploy/zine/bin/python /home/yospaly/deploy/zine/scripts/server -a 127.0.0.1 --no-reloader --no-debugger --threaded -p 6666 -I <YOU-HOME-PATH>/deploy/blog/

[program:blog2]
command = <YOU-HOME-PATH>/deploy/zine/bin/python /home/yospaly/deploy/zine/scripts/server -a 127.0.0.1 --no-reloader --no-debugger --threaded -p 8888 -I <YOU-HOME-PATH>/deploy/blog2/
  • 配置文件的第一段用来配置 supervisord 后台管理服务器一些输出文件的路径;
  • 第二段用来打开 supervisord 内部的 Socket 服务, 以便接受和处理来自控制程序 (supervisorctl) 请求;
  • 第三段是必备的, 详见注释;
  • 第四段告诉控制程序 (supervisorctl) 通过什么途径和 supervisord 通信;

使用 supervisorctl 进行控制

supervisord.conf 所在的工作目录执行 supervisord 运行后台管理服务器, 如果运行失败请查看工作目录下的错误日志;

supervisord 跑起来后, supervisorctl 就可以方便的手工管理守护程序了:

supervisorctl start all
supervisorctl stop blog
supervisorctl restart blog2

结束语

Supervisor 是一个易用, 又不失强大的工具, 这里只涉及了 Supervisor 最基本的使用, 还有很多更加高级和有用的功能未能覆盖, 可以进一步参考 Supervisor 官方文档.

This entry was tagged Python and Supervisor

blog comments powered by Disqus