Supervisord使用

今天的一个小时学习编程工具是基于python开发的任务管理工具Supervisord,项目官方地址为。下面主要是说明Supervisord的基本用发以及在mac和centos中应用。

一、Supervisord基本用法

1.1 安装Supervisord

supervisor安装方法如下:

1
2
apt-get install supervisor # ubuntu
pip install supervisor # 使用python pip 安装

1.2 配置修改

supervisor默认找配置的路径如:/usr/local/etc/supervisord.conf, /usr/local/supervisord.conf, supervisord.conf, etc/supervisord.conf, /etc/supervisord.conf, /etc/supervisor/supervisord.conf

把所有的配置文件都放在 supervisord.conf 并不是个好主意,一旦管理的进程过多,就很麻烦。所以一般都会 新建一个目录来专门放置进程的配置文件,然后通过 include 的方式来获取这些配置信息

1
2
[include]
files = /etc/supervisor/conf.d/*.conf

1.3 Supervisord基础命令

命令详解

  • supervisord: 初始启动Supervisord,启动、管理配置中设置的进程;
  • supervisorctl stop(start, restart) xxx,停止(启动,重启)某一个进程(xxx);
  • supervisorctl reread: 只载入最新的配置文件, 并不重启任何进程;
  • supervisorctl reload: 载入最新的配置文件,停止原来的所有进程并按新的配置启动管理所有进程;
  • supervisorctl update: 根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启;

a. 管理进程例子

supervisord是通过 supervisorctl进行进程管理,由于目前没有添加任何需要管理的进程,所以 status 没有输出人和结果,接下来我们添加一个需要管理的进程 (以启动一个 celery 的 worker 为例)。

1
2
3
4
5
6
7
[program:celeryd]
command=celery worker --app=task -l info ; 启动命令
stdout_logfile=/var/log/supervisor/celeryd_out.log ; stdout 日志输出位置
stderr_logfile=/var/log/supervisor/celeryd_err.log ; stderr 日志输出位置
autostart=true ; 在 supervisord 启动的时候自动启动
autorestart=true ; 程序异常退出后自动重启
startsecs=10 ; 启动 10 秒后没有异常退出,就当作已经正常启动

然后运行以下命令更新配置并启动进程:

  • supervisorctl reread: 只更新配置文件
  • supervisorctl update: 只启动有改动的进程
  • supervisorctl status: 查看状态

我们看到 celery worker 已经被成功启动了。你可以使用不同的命令来控制进程的启动和关闭:

1
2
3
supervisorctl stop celeryd # 停止
supervisorctl start celeryd
supervisorctl restart celeryd

切记,每次修改或增删了配置文件, 都需要执行: supervisorctl update。执行supervisord可以进入 supervisorctl 的 shell 界面,

1
2
3
$ supervisorctl
supervisor> status # 查看状态
supervisor>

二、Supervisord在Mac osx中的应用

在mac中启用supervisor需要借助launchctl, 启用后就可以借助supervisor启用其他相关的进程了。这里说下我的配置,supervisord进程和配置内容如下:

  • conf: /usr/local/etc/supervisord.conf
  • bin: /usr/local/bin/supervisord

配置文件/usr/local/etc/supervisord.conf内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
; conf:/usr/local/etc/supervisord.conf
; bin:/usr/local/bin/supervisord
[unix_http_server]
file=/tmp/supervisor.sock ; path to your socket file
[supervisord]
logfile=/usr/local/var/log/supervisord/supervisord.log ; supervisord log file
logfile_maxbytes=50MB ; maximum size of logfile before rotation
logfile_backups=10 ; number of backed up logfiles
loglevel=error ; info, debug, warn, trace
pidfile=/usr/local/var/run/supervisord.pid ; pidfile location
nodaemon=false ; run supervisord as a daemon
minfds=1024 ; number of startup file descriptors
minprocs=200 ; number of process descriptors
user=root ; default user
childlogdir=/usr/local/var/log/supervisord/ ; where child log files will live
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
[include]
; files = /usr/local/etc/supervisor/conf.d/*.conf
files = /usr/local/etc/supervisor.d/*.conf
[program:mongod]
command=/usr/local/bin/mongod
[program:redis-server]
command=/usr/local/bin/redis-server

vim ~/Library/LaunchAgents/supervisord.plist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>Label</key>
<string>supervisord</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/supervisord</string>
<string>-n</string>
<string>-c</string>
<string>/usr/local/etc/supervisord.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

配置好后执行如下命令运行:

launchctl load ~/Library/LaunchAgents/supervisord.plist

三、扩展


以上内容,感谢如下博主分享: