我为什么想用 supervisor 来管理服务呢?因为我在系统管理上属于处女座+任性的气质。
- OSX 下办公用的是普通用户,我不想在 root 权限下做过多设置污染我的系统。
- OSX 下的服务管理我感觉不是很便捷,毕竟 OSX 是倾向于黑盒用户体验,很多事情不透明。但是在服务管理一块我希望透明和自由一些。
所以我要说一下我怎么在尽量少污染 root 的情况下,使用普通用户配置 supervisor 并启动我的 mysql。
- 下列操作如没有 sudo 命令,则均在 OSX 普通用户下操作,不涉及到提权到超级用户。
- 另外我的用户名是 fangyunlin,所以我的 home 目录是 /Users/fangyunlin/
部署 supervisor
在 Linux 下常用的服务管理框架有三种:
- 基于老时代的 sysV,也就是把启动配置放在 /etc/init.d 下,然后使用 chkconfig 和 service 命令进行管理服务。比如 CentOS 6 以及更低版本都是这样的。
- 新时代的 systemd,也就是把启动配置放在 /usr/lib/systemd/system/ 下,然后使用 systemd 进行管理。
- 以及新老通吃的 supervisor。
supervisor 是一套基于 python 的服务管理框架,某种意义上说他属于 sysV / systemd 的上层,他的启动也需要这两个或者其他服务管理框架来启动。这里不多说,这次主要讲 how to,不讲 why。
OSX 默认没有安装 pip。pip 是一个 python 的包管理工具,可以用于安装 python 库以及 python 程序。
sudo easy_install pip pip install supervisor
这时候 supervisor 会安装到当前用户的 python 目录 /Users/fangyunlin/Library/Python/2.7/ 之下。
确认 python 目录的 bin 子目录在 PATH 环境变量中,可以直接调用 supervisor 系列命令。如果没有,可以按照下面添加到 ~/.bashrc 或者 ~/.zshrc 中:
export PYPATH_LIB_27=~/Library/Python/2.7 export PATH=$PATH:$GOPATH/bin:$PYPATH_LIB_27/bin
初始化 supervisord 配置
cp ~/Library/Python/2.7/lib/python/site-packages/supervisor/skel/sample.conf ~/Library/Python/2.7/etc/supervisord.conf
把配置中 [files] section 反注释掉:
[include] files = supervisord.d/*.ini
创建子配置目录,等下会把 supervisor 服务配置丢到里面来。
mkdir /Users/fangyunlin/Library/Python/2.7/etc/supervisord.d/
把我要管理的服务配置到 supervisor 中
我有一个 MySQL 服务,启动命令是
/usr/local/bin/docker-compose up
嗯,我使用 docker 来使用 MySQL,还是因为我不想让一些服务污染我的 root 环境。docker 的事情有心情的话以后再说。大家当作是一个普通服务就好。
所以我在 /Users/fangyunlin/Library/Python/2.7/etc/supervisord.d/ 中添加一个文件名为 mysql.ini,内容如下:
[program:mysql] command=/usr/local/bin/docker-compose up directory=/Users/fangyunlin/docker/compose/mysql autostart=true autorestart=unexpected startsecs=10 startretries=3
启动 supervisor
如果你希望登录用户即启动 supervisor,那就在 ~/Library/LaunchAgents/ 目录下新建个文件比如叫做 com.fangyunlin.supervisord.plist 。名字是否要遵循这个格式我不想去深究,反正依葫芦画瓢。内容如下:
<!-- /Library/LaunchDaemons/com.fangyunlin.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>com.fangyunlin.supervisord</string> <key>ProgramArguments</key> <array> <string>/Users/fangyunlin/Library/Python/2.7/bin/supervisord</string> <string>-n</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
这样就可以登录用户自启动了。不过我没这么做,我喜欢有需要的时候手动执行以下
supervisord
我觉得太黏人的女朋友不好,距离产生美。我不需要你就别自己启动了。
上面只是借口,其实也可以默认就启动 supervisord,但是 supervisord 管理的服务不要 autostart,通过命令
supervisorctl start mysql
这时候通过命令
supervisorctl status
就可以看到 mysql 跑起来了
最后比较了一下,通过 plist 启动 supervisord,supervisord 子服务不自动启动,按照需求 supervisorctl start 的方式……
真香……
参考资料
supervisord 文档:http://www.supervisord.org/configuration.html
docker-compose 文档:https://docs.docker.com/compose/compose-file/