安装 supervisor
在 Ubuntu 上, 你可以且应该这样安装:
apt-get install supervisor
除了安装可执行程序本身, 还会创建默认的配置文件和目录:
/etc/supervisord.conf
/etc/supervisor/cond.d/
在 Mac 上, 你无法使用 apt-get, 经测试, 也无法使用 brew. 由于 supervisor 是一个 Python 包, 因此可以使用 pip 来安装:
pip install supervisor
但这样安装后, 是不会创建配置文件的. 你需要自己手工创建. 为求简便, 这里不创建配置文件子目录, 而是直接把所有配置写在 supervisord.conf 本身:
[unix_http_server]
file=/tmp/supervisor.sock ; path to your socket file
[supervisord]
logfile=/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=/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=/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
[program:mongod]
command=/usr/local/bin/mongod
[program:redis-server]
command=/usr/local/bin/redis-server
配置例子
创建/var/log/supervisord/supervisord.log
chmod 777 /var/log/supervisord/supervisord.log
vim /usr/local/etc/supervisord.conf
1. [unix_http_server]
2. file=/tmp/supervisor.sock
3. chmod=0700
4.
5. [supervisord]
6. logfile = /var/log/supervisord/supervisord.log
7. logfile_maxbytes = 50MB
8. logfile_backups=10
9. loglevel = info
10. pidfile = /tmp/supervisord.pid
11. nodaemon = False
12. minfds = 1024
13. minprocs = 200
14. umask = 022
15. identifier = supervisor
16. directory = /tmp
17. nocleanup = true
18. childlogdir = /tmp
19.
20. [supervisorctl]
21. serverurl = unix:///tmp/supervisor.sock
22.
23. [rpcinterface:supervisor]
24. supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
25.
26. [include]
27. files = /usr/local/etc/supervisor/conf.d/*.conf
使用 launchctl 来启动 supervisor 自身
虽然 supervisor 可以很好的管理后台进程, 但是其自身的自启动还是需要借助其它工具. 在 Linux 上, 你可以用 Upstart, SystemVInit, Sysytemd 等. 而在 Mac 上, 还是要借助 launchctl 的帮助. 谁叫这是在 Mac 的地盘上呢? 好消息是, 你只用配置这一次, 以后其它的需要后台启动的服务, 就可以全部交给 supervisor 了.
下面介绍配置的步骤, 顺便吐槽为什么我不喜欢 launchctl .
launchctl 的配置文件可以存放于这些目录:
~/Library/LaunchAgents Per-user agents provided by the user.
/Library/LaunchAgents Per-user agents provided by the administrator.
/Library/LaunchDaemons System wide daemons provided by the administrator.
/System/Library/LaunchAgents Mac OS X Per-user agents.
/System/Library/LaunchDaemons Mac OS X System wide daemons.
(配置文件目录太多. 每次添加文件都头大)
这里我在 ~/Library/LaunchAgents 目录下, 创建一个 supervisord.plist 文件, 内容如下:
<?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>/etc/supervisord.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
(配置文件的格式非常奇葩, 本来一行配置可以搞定的事, 它需要一个 n 行的 xml 配置文件, 每个命令参数都需要写在单独的节点里, 及其繁琐, Java 程序员可能比较习惯)
接下来, 你可以启动 supervisor 了:
launchctl load ~/Library/LaunchAgents/supervisord.plist
(这个命令也非常不友好, 例如: 要不要 sudo? 为什么是 load 而不是常规的 start? 为什么要用配置文件的路径而不用名字?)
管理进程
每次修改或增删了配置文件, 都需要执行:
sudo supervisorctl update
这个在刚开始使用 sv 时可能会带来一些困惑. 如果你不执行, 而只是 restart 某个进程, sv 使用的还是以前的版本.
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于