我為什麼想用 supervisor 來管理服務呢?因為我在系統管理上屬於處女座+任性的氣質。 所以我要說一下我怎麼在儘量少污染 root 的情況下,使用普通用戶配置 supervisor 並啟動我的 mysql。 下列操作如沒有 sudo 命令,則均在 OSX 普通用戶下操作,不涉及到提權到超級用戶 ...
我為什麼想用 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/