2019年10月9日 星期三

使用 Homebrew-services 設定守護行程或是任務項


前情提要:在 macOS 的啟動守護行程一文中介紹了 macOS 的守護行程 (Daemon) 以及任務項 (Agent),在 Homebrew 簡介一文中,介紹了如何使用 Homebrew 安裝套件。

本文將以 Apache HTTP Server 為例,介紹如何將安裝好的套件設定為守護行程或是任務項。

將 httpd 設定為 Daemon


要讓 httpd 能夠在開機自動執行,可以執行下列的指令:
sudo brew services start httpd


上面的指令包含了下面的動作:

1. 自動安裝 homebrew-services(用來整合 Homebrew 跟 macOS 的 launchctl 管理器)。


2. 將 httpd 的 plist 檔案(homebrew.mxcl.httpd.plist)複製到 /Library/LaunchDaemons (加入到 Launchd) :
sudo cp /usr/local/opt/httpd/homebrew.mxcl.httpd.plist /Library/LaunchDaemons
sudo chown root:wheel /Library/LaunchDaemons/homebrew.mxcl.httpd.plist
sudo chmod 644 /Library/LaunchDaemons/homebrew.mxcl.httpd.plist


3. 將下列的檔案夾或是檔案的擁有者更改為 root:
/usr/local/opt/httpd
/usr/local/opt/httpd/bin
/usr/local/opt/httpd/bin/httpd
/usr/local/var/homebrew/linked/httpd


注意:我們在執行 Homebrew 時,使用的是目前登入的使用者權限,因此在升級、移除或是重新安裝 httpd 時,要使用 'sudo rm' 指令手動移除 httpd 舊版本的 Keg 檔案夾。直接使用 brew uninstall httpd 會出現下列的錯誤:
Error: Could not remove httpd keg! Do so manually:
  sudo rm -rf /usr/local/Cellar/httpd/2.4.41_1



4. 執行 sudo launchctl load 將 httpd 加入 launchd:
sudo launchctl load /Library/LaunchDaemons/homebrew.mxcl.httpd.plist



在使用 Homebrew 安裝軟體時,plist 檔案預設會安裝在 Keg 檔案夾中,若要讓服務在開機時使用 root 權限自動執行 (成為守護行程),就要使用上述的 brew services 指令進行設定,或是以手動的方式執行上面的步驟 2、3、以及 4。


我們可以使用 launchctl list 指令檢查 httpd 是否已經被加入 launchd 中:
sudo launchctl list | grep httpd



將 httpd 從 Launchd 中移除或是重新加入


要將 httpd 從 Launchd 中移除,可以執行下列的指令:
sudo brew services stop httpd


在修改過 plist 檔案,或是要重新加入 Launchd,可以使用下列的指令:
sudo brew services restart httpd


將 httpd 設定為 Agent


要讓 httpd 能夠在登入後自動執行,可以執行下列的指令:
brew services start httpd



上面的指令包含了下面的動作:

1. 自動安裝 homebrew-services(如果之前沒有安裝過的話)。


2. 將 Keg 檔案夾中的 plist 檔案複製到 ~/Library/LaunchAgents:
cp /usr/local/opt/httpd/homebrew.mxcl.httpd.plist ~/Library/LaunchAgents


3. 執行 launchctl load,啟動 httpd:
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.httpd.plist



注意:使用 brew services 讓服務 (例如本文中的 httpd) 成為 Daemon 或是 Agent,主要的差異在於是否使用 sudo 指令。

將 httpd 從守護行程中移除或是重新加入


安裝 Homebrew-services 後,也可以使用它將 httpd 從任務項中移除:
brew services stop httpd


或是重新加入任務項 (在修改 homebrew.mxcl.httpd.plist 之後):
sudo brew services restart httpd


僅啟動 httpd


Homebrew-services 也可以只用來啟動 httpd:
brew services run httpd



列出可以被管理的服務


使用下列的指令可以列出所有可以被 brew services 管理的套件:
brew services list


或是簡單的使用:
brew services


如果先前執行過:
brew services start httpd


會輸出下列的資訊:
Name    Status  User  Plist
httpd   started userName /Users/userName/Library/LaunchAgents/homebrew.mxcl.httpd.plist
php     stopped       
redis   stopped  


顯示目前 httpd 是登入啟動的任務項 (plist 檔在 ~/Library/LaunchAgents/)。

如果使用 sudo 執行:
sudo brew services start httpd


再一次執行 brew services 則會列出:
Name    Status  User  Plist
httpd   started root  /Library/LaunchDaemons/homebrew.mxcl.httpd.plist
php     stopped       
redis   stopped  


顯示目前 httpd 是守護行程 (plist 檔在 /Library/LaunchDaemons/)。


注意:當把 httpd 設定為守護行程後,雖然在執行 sudo brew services stop httpd 後,會將 httpd 的 plist 檔從  /Library/LaunchDaemons/ 中移除,httpd 的 plist 檔仍然存在於  ~/Library/LaunchAgents/ 中。


提醒:因為 Mac 大部份是用來做為開發用,因此建議將服務設為任務項,在登入時啟動即可。

附記

在 2020/02/03 曾出現過 brew services - Unknown command 的問題,雖然問題很快就被解決,但是使用者要執行 brew update 才能夠再使用 brew services。

沒有留言: