以前一直是用 systemd 設置開機啟動的服務,因為它不需要裝額外的軟件,方便。
但是最近遇到個問題,就是我還需要在 OS X 上設置 Jenkins Agent 的開機自啟,為此專門學習了下 launchctl 的使用,最后還是功虧一簣,敗在了環境變量設置這一步——不知道為啥,我在 /Library/LaunchDaemons/io.jenkinsagent.plist 里設置的 EnvironmentVariables 字段無法生效,搞了半天沒找到問題。
今天才突然想起,為何不用 supervisord 呢?!關鍵這個還跨平台,一份配置稍微改改就可以同時用在 MacOS 和 Linux 上。
一、MacOS X 安裝 supervisord
顯然我不希望自己再寫個 LaunchDaemons 的 plist 文件來把 supervisord 弄成開機自啟。好在 homebrew 有提供傻瓜式方案,安裝方式如下:
brew services # homebrew 的 service 讓我們脫離手工編寫 plist 的“低級趣味”。
brew install supervisor # 安裝 supervisord
brew services start supervisor # 借助 service 使 supervisor 開機啟動
homebrew services 的詳細使用方法可見 github- homebrew service
如需加速安裝,可參考 homebrew 清華鏡像源使用說明
安裝啟動后,可查看 supersivor 的配置文件 /usr/local/etc/supervisord.ini,如需添加自啟動程序,可將配置文件添加到 /usr/local/etc/supervisor.d/ 中,該文件夾中的配置會被主配置文件 include.
詳細的說明見后。
使用 supervisord
編寫配置文件
注意:屬性名稱錯誤,不會給出任何提示!!!所以無法運行時,請仔細檢查配置中的屬性是否有拼寫錯誤!
以 Jenkins-Agent 為例,編寫 /usr/local/etc/supervisor.d/jenkins-agent.ini,內容如下:
[program:jenkins-agent]
command=/bin/bash /Users/jenkins/jenkins_home/connect.sh ; 從 jenkins web 頁面復制的連接命令
autostart=true
startsecs=5 ; 啟動 5 秒后沒有異常退出,就當作已經正常啟動了
autorestart=true ; 程序異常退出后自動重啟
startretries=3 ; 啟動失敗自動重試次數,默認是 3
stopasgroup=true
redirect_stderr=true ; 將 stderr 重定向到 stdout
stdout_logfile=/Users/jenkins/jenkins_home/jenkins-agent.log ; 日志輸入位置
stdout_logfile_maxbytes=1MB
environment=PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin"
supervisor 啟動服務時,只會包含系統的環境變量。而上面的配置文件,顯然也並不方便設置多個環境變量。
因此推薦的做法是在啟動腳本中進行相關的環境設置:
# connect.sh 的內容
# java for jenkins-agent
export PATH="/Applications/openjdk8/Contents/Home/bin:$PATH"
# flutter
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn
export PATH="/Applications/flutter/bin:$PATH"
# connect jenkins master
cd /Users/jenkins/jenkins_home/
# 下面是 jenkins 連接命令
java -jar agent.jar -jnlpUrl ......
這樣就能在啟動程序前,設置好需要的環境。
啟用配置
通過 supervisorctl 操作 supervisor:
- 連接 supervisor 后端:
supervisorctl -c /usr/local/etc/supervisord.ini,注意必須指定啟動 supervisor 時用的配置文件。 - 然后就可以通過
help查看 supervisorctl 支持的命令了,常用的有reload重載配置,restart all重啟所有應用。
通過 start all 就可以啟動配置好的應用了。
二、Linux 安裝 supervisor
一般建議通過包管理器安裝,好處是不用手寫 systemd 配置,缺點是更新太慢。
sudo apt-get install supervisor # 安裝
sudo systemctl enable supervisor # 啟用開機啟動
sudo systemctl start supervisor # 現在啟動
如果需要新版本的功能,可以通過 pip 安裝最新版,但是需要手動編寫 systemd 配置(或者先用 apt-get 裝老版本,把 systemd 配置拷下來)。詳見 installing supervisor
使用方法
用法見前面的 MacOS X,基本上可以套用,只有如下幾個區別:
- 默認的配置文件路徑不同,主配置文件是
/etc/supervisor/supervisord.conf,自定義配置路徑/etc/supervisor/conf.d/*.conf - 注意 Linux 中配置的后綴是
.conf,而在 OS X 中默認使用.ini
畫外:Windows 呢?
Windows 也有自己的 Service 功能,不過就和 OS X 的 launchd 一樣,我對它的了解程度小於 1%。
因此同樣依靠懶人方法,推薦使用 winsw。
不過目前這個方法我還沒用過,因為目前沒有啥需要設置成 Windows Serivce 的應用。
