我为什么想用 supervisor 来管理服务呢?因为我在系统管理上属于处女座+任性的气质。

  1. OSX 下办公用的是普通用户,我不想在 root 权限下做过多设置污染我的系统。
  2. 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/

最新文章

  1. Thoughtful function is also good for investigation
  2. Metrics-Java版的指标度量工具之一
  3. java类生命周期详细解析
  4. cocos2d-x之单点触碰初试
  5. Android权限设置android.permission
  6. Java 线程间通讯(共享变量方式)
  7. javascript 上传 预览图片 兼容 谷歌 ie
  8. Java实现折半(二分)插入排序
  9. ODBC 中遇到的错误
  10. mysql 服务启动报1607 error
  11. java中的方法引用
  12. Event(事件)的传播与冒泡
  13. WEB前端 CSS(非布局)
  14. keras-yolo3-master
  15. R 语言消除pdf图片的空白
  16. rest_cherrypy
  17. 20155202 2016-2017-2 《Java程序设计》第6周学习总结
  18. docker_Dockerfile_docker hub简单使用搭建nginx
  19. AtCoder - 2567 RGB Sequence
  20. pkav漏洞之精华部分

热门文章

  1. Python pip 安装与使用
  2. 16. 窗口函数 (Window Function) 的使用
  3. olivettifaces数据集实现人脸识别代码
  4. Geth命令用法-参数详解 and 以太坊源码文件目录
  5. Nodejs学习资源汇总
  6. 【洛谷】【单调栈】P1823 音乐会的等待
  7. jQuery 使用ajax,并刷新页面
  8. 【转】 Android常用实例—Alert Dialog的使用
  9. WorldWind源码剖析系列:相机类CameraBase
  10. redis安装及常用命令