我为什么想用 supervisor 来管理服务呢? 因为我在系统管理上属于处女座 + 任性的气质.
OS X 下办公用的是普通用户, 我不想在 root 权限下做过多设置污染我的系统.
OS X 下的服务管理我感觉不是很便捷, 毕竟 OS X 是倾向于黑盒用户体验, 很多事情不透明. 但是在服务管理一块我希望透明和自由一些.
所以我要说一下我怎么在尽量少污染 root 的情况下, 使用普通用户配置 supervisor 并启动我的 MySQL.
下列操作如没有 sudo 命令, 则均在 OS X 普通用户下操作, 不涉及到提权到超级用户.
另外我的用户名是 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.
OS X 默认没有安装 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/
来源: https://www.cnblogs.com/cst05001/p/10475557.html