本文使用「署名 4.0 國際 (CC BY 4.0)」許可協議,歡迎轉載、或從新修改使用,但須要註明來源。 署名 4.0 國際 (CC BY 4.0)html
本文做者: 蘇洋python
建立時間: 2019年03月11日 統計字數: 4709字 閱讀時間: 10分鐘閱讀 本文連接: https://soulteary.com/2019/03/11/mac-osx-starts-up-applications-supervisor.htmlgit
Mac OSX 的穩定性一貫不錯,不管是用於跑基於 XCode 的 CI,仍是用於作簡單的 HomeLab
使用,都能知足需求。github
可是在日程使用中,不免出現系統維護須要重啓、應用遇到問題崩潰退出運行,這個時候,就不得不引用進程管理工具來幫助咱們進行應用的開機啓動或者進程退出重啓了。編程
本篇文章將花十分鐘左右介紹如何簡單優雅的對 Mac 進行程序開機啓動、運行保護,先從開機啓動聊起。瀏覽器
提及 Mac 的開機啓動,一般繞不開 LaunchDaemons
、LaunchAgent
、Login Item
、Startup Items
、AppHelper
等關鍵詞。ruby
凡是折騰過應用開機啓動的同窗,必定對上面的關鍵詞很清楚,手寫 plst
是基礎要求,若是想用戶不登陸自動啓動應用,可能還須要小寫一段代碼,編譯成應用的 Helper
。bash
有沒有既好用,又沒必要這麼硬核的應用啓動方案呢?app
這裏依舊推薦 Supervisor,早些時候,我曾不止一次的推薦過這款開源應用,它不光活躍在各大互聯網公司的生產環境中,還可以運行在各類開發、線下環境中,而且會主動適配各類環境。python2.7
在 Mac OSX 環境中,若是想快捷安裝它,須要先安裝 brew
(一句話安裝)。
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
複製代碼
安裝完畢以後,執行下面的命令,即可以安裝好 supervisor
以及配套的 services
應用。
brew install supervisor
brew install services
複製代碼
安裝完畢以後,只須要執行下面的命令即可以啓動 supervisor
。
brew services start supervisor
複製代碼
若是進程已經執行,你將會受到下面的提示,能夠忽略掉。
Service `supervisor` already started, use `brew services restart supervisor` to restart.
複製代碼
若是你想關閉 supervisor
,只須要將上面的參數替換爲 stop
便可。
brew services stop supervisor
複製代碼
安裝完畢以後,咱們的默認配置會保存在下面的位置。
/usr/local/etc/supervisord.ini
複製代碼
雖然咱們最常使用命令行的方式對 supervisor
進行操做,可是它一樣提供了一個更簡單的方式進行進程的管理和查看:Web 界面。
瀏覽上面的配置文件,你將會看到這麼一段被註釋掉的配置。
;[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
;username=user ; default is no username (open server)
;password=123 ; default is no password (open server)
複製代碼
若是不在公網開放,僅供本機進行調試維護,能夠將頭兩行配置前的註釋符號 ;
去掉,變成下面的樣子:
[inet_http_server] ; inet (TCP) server disabled by default
port=127.0.0.1:9001 ; ip_address:port specifier, *:port for all iface
;username=user ; default is no username (open server)
;password=123 ; default is no password (open server)
複製代碼
接着執行下面的命令,重啓 supervisor
,讓配置生效。
brew services reload supervisor
複製代碼
驗證 HTTP 管理界面的方式很簡單,打開瀏覽器,訪問 http://127.0.0.1:9001
便可,或者使用 lsof
命令也能夠快速驗證服務是否正常,若是你也看到相似下面的命令行輸出,那麼服務就很輕鬆愉快的跑起來了。
soulteary in ~ λ lsof -i:9001
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
Google 5388 soulteary 34u IPv4 0x2fed8630edccdf51 0t0 TCP localhost:49785->localhost:etlservicemgr (ESTABLISHED)
Google 5388 soulteary 45u IPv4 0x2fed8630ee723c51 0t0 TCP localhost:49786->localhost:etlservicemgr (ESTABLISHED)
Google 5388 soulteary 50u IPv4 0x2fed8630ee5165d1 0t0 TCP localhost:49787->localhost:etlservicemgr (ESTABLISHED)
python2.7 7593 soulteary 5u IPv4 0x2fed8630edccf251 0t0 TCP localhost:etlservicemgr (LISTEN)
python2.7 7593 soulteary 8u IPv4 0x2fed8630edccd5d1 0t0 TCP localhost:etlservicemgr->localhost:49785 (ESTABLISHED)
python2.7 7593 soulteary 9u IPv4 0x2fed8630ec024c51 0t0 TCP localhost:etlservicemgr->localhost:49786 (ESTABLISHED)
python2.7 7593 soulteary 10u IPv4 0x2fed8630ec027251 0t0 TCP localhost:etlservicemgr->localhost:49787 (ESTABLISHED)
複製代碼
若是此刻你重啓設備,等待設備重啓完成,除了使用 ps -ef
檢查 supervisor
是否運行以外,使用瀏覽器打開 127.0.0.1:9001
也是同樣的。
日誌是應用執行過程當中寶貴的財富,因此要將 supervisor
的日誌好好保存,默認配置中,日誌會保存在下面的地方,根據本身的狀況將日誌挪到便於管理的地方吧,若是作了修改,也別忘記要重啓進程,方法上面交代過了。
[supervisord]
logfile=/usr/local/var/log/supervisord.log ; main log file; default $CWD/supervisord.log
複製代碼
繼續瀏覽配置文件,不難發現 Supervisor
默認會自動讀取 /usr/local/etc/supervisor.d/
目錄下全部的 ini
文件。
[include]
files = /usr/local/etc/supervisor.d/*.ini
複製代碼
考慮到可維護性,咱們要對它進行一些修改,將啓動配置「就近保存」在須要被啓動的應用的目錄內,好比 ~/Service/example
中,好比這樣。
[include]
files = /Users/soulteary/Service/*/conf/supervisor.ini
複製代碼
接下來咱們將編寫一個簡單的腳原本對 supervisor
進行進程啓動和守護的能力驗證。
先準備一個項目目錄。
mkdir -p ~/Service/example
複製代碼
在目錄中建立一個名爲 test.sh
的腳本,內容以下:
#!/usr/bin/env bash
python -m SimpleHTTPServer 8080
複製代碼
賦予腳本執行權限以後,咱們能夠運行這個腳本。
chmod +x test.sh
./test.sh
複製代碼
當你打開瀏覽器,訪問 127.0.0.1:8080
,你將會看到一個使用 Python 運行的 Web Server。
在項目目錄中建立一個 conf
文件夾,用來存放 supervisor
程序的配置文件。
mkdir conf
touch conf/supervisor.ini
複製代碼
配置文件內容示例:
[program:test]
; 啓動目錄
directory = /Users/soulteary/Service/example/
; 執行命令
command = /Users/soulteary/Service/example/test.sh
; 隨 supervisord 啓動
autostart = true
; 程序啓動 5s 內沒有異常則認爲是正常運行
startsecs = 5
; 程序異常退出後從新啓動
autorestart = true
; 重試啓動程序多少次
startretries = 3
; 默認使用當前用戶執行應用
user = soulteary
; 須要手動建立目錄
stdout_logfile = /Users/soulteary/Service/log/supervisor.log
複製代碼
重啓 supervisor
後,使用瀏覽器或者 ps
驗證,Web Server 運行了起來,說明 supervisor
是可以啓動進程的。
在驗證 supervisor
是否可以守護進程,須要關閉當前 Web Server 進程,先使用命令行獲取當前進程 PID 。
ps -ef | grep test.sh | grep -v grep | awk '{print $2}'
複製代碼
舉個例子,此處 PID 顯示 1529 ,接下來咱們執行下面的命令,進行進程殺除,此時瀏覽器中的站點應該已經打不開了。
ps -ef | grep test.sh | grep -v grep | awk '{print $2}' | xargs -I {} kill {}
複製代碼
稍等片刻,刷新瀏覽器,Web 服務又被啓動了起來,再次執行第一條命令,能夠看到進程 PID 已經變化,說明 supervisor
已經配置完畢。
固然,supervisor
也提供了一套簡單好用的命令給用戶使用,好比可使用下面的命令查看當前須要被守護的應用的運行狀態:
supervisorctl status
test RUNNING pid 1629, uptime 0:04:21
複製代碼
更多命令,請自行查詢文檔,這裏就不贅述了。固然,你也能夠從 Web 界面查看當前應用是否成功運行。
若是你對本文描述內容不是很熟悉,能夠翻閱以往的文章,補全對上述技術的認識,但願個人文章對你有所幫助。
— EOF
我如今有一個小小的折騰羣,裏面彙集了一些喜歡折騰的小夥伴。
在不發廣告的狀況下,咱們在裏面會一塊兒聊聊軟件、HomeLab、編程上的一些問題,也會在羣裏不按期的分享一些技術沙龍的資料。
喜歡折騰的小夥伴歡迎掃碼添加好友。(請註明來源和目的,不然不會經過審覈)