zoukankan      html  css  js  c++  java
  • 在 OSX 下使用 supervisor 管理服务

    我为什么想用 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/

  • 相关阅读:
    修改git提交的用户名和密码
    并发编程大师系列之:wait/notify/notifyAll/condition
    并发编程大师系列之:Synchronized的类锁和对象锁
    并发编程大师系列之:线程的定义和中断 interrupt
    SpringBoot项目mysql配置文件密码加密(jasypt)
    Linux下安装nginx实现伪分布
    idea远程debug调试阿里云ECS
    使用docker简单启动springboot项目
    用Navicat连接阿里云ECS服务器上的MySQL数据库
    Linux下安装JDK1.8
  • 原文地址:https://www.cnblogs.com/cst05001/p/10475557.html
Copyright © 2011-2022 走看看