使用 supervisord 設置應用開機啟動


以前一直是用 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:

  1. 連接 supervisor 后端:supervisorctl -c /usr/local/etc/supervisord.ini,注意必須指定啟動 supervisor 時用的配置文件。
  2. 然后就可以通過 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,基本上可以套用,只有如下幾個區別:

  1. 默認的配置文件路徑不同,主配置文件是 /etc/supervisor/supervisord.conf,自定義配置路徑 /etc/supervisor/conf.d/*.conf
  2. 注意 Linux 中配置的后綴是 .conf,而在 OS X 中默認使用 .ini

畫外:Windows 呢?

Windows 也有自己的 Service 功能,不過就和 OS X 的 launchd 一樣,我對它的了解程度小於 1%。

因此同樣依靠懶人方法,推薦使用 winsw

不過目前這個方法我還沒用過,因為目前沒有啥需要設置成 Windows Serivce 的應用。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM