←→ Underneath: Background Apps · 所有 Mac 指南
如何在 Mac 上安全地停用啟動代理程式
最常見的建議是把 .plist 從 LaunchAgents 中刪除。但這也是最糟的做法:工作會一直執行到你重新開機,而且無法復原。以下是安全且可復原的做法。
簡短回答:找出工作的標籤,然後執行
launchctl bootout gui/$(id -u)/com.example.label
launchctl disable gui/$(id -u)/com.example.label
第一個指令會立即停止它。第二個指令會讓它在重新開機後保持關閉。launchctl enable 可以復原。
開始之前:不要更動 /System/Library 中的任何東西,或任何以 com.apple. 開頭的標籤。它們屬於 macOS。除非你要移除該工具,否則請不要動 VPN、備份、安全性和驅動程式工具。
步驟 1:找出工作
啟動代理程式和常駐程式位於以下三個你可以更改的檔案夾中:
~/Library/LaunchAgents:你自己的代理程式。不需要密碼。/Library/LaunchAgents:所有使用者的代理程式。更改檔案需要管理者密碼。/Library/LaunchDaemons:以 root 身分執行的系統常駐程式。需要sudo。
列出目前已載入的項目,排除 Apple 自己的工作:
launchctl list | grep -v com.apple
欄位依序為程序 ID(未執行時為 -)、上次結束狀態,以及標籤。你需要的是標籤。
步驟 2:確認它的用途
plutil -p ~/Library/LaunchAgents/com.example.label.plist
ProgramArguments或Program:它執行什麼。路徑指向你認得的 App 嗎?那個 App 還在嗎?RunAtLoad:每次登入時啟動。KeepAlive:停止時會重新啟動。StartInterval/StartCalendarInterval:依排程執行。
如果程式路徑指向你已刪除的 App,這個工作就是殘留項目,可以安全移除。如果它是更新程式,停用後 App 就不會自動更新。
步驟 3:備份
mkdir -p ~/LaunchAgents-backup
cp ~/Library/LaunchAgents/com.example.label.plist ~/LaunchAgents-backup/
步驟 4:立即停止
代理程式(位於任一 LaunchAgents 檔案夾):
launchctl bootout gui/$(id -u)/com.example.label
位於 /Library/LaunchDaemons 的常駐程式:
sudo launchctl bootout system/com.example.label
這會卸載工作並結束其程序。這個狀態在重新開機後不會保留(如果工作設有 RunAtLoad)。
步驟 5:讓它保持關閉
選擇其中一種。
選項 A:launchctl disable(建議)
launchctl disable gui/$(id -u)/com.example.label
常駐程式請用:sudo launchctl disable system/com.example.label。
macOS 會把標籤存到它自己的停用清單中,所以即使 App 重新寫入 plist,工作仍會保持關閉。用以下指令檢查清單:
launchctl print-disabled gui/$(id -u)
選項 B:把 plist 移走
mkdir -p ~/Library/LaunchAgents/Disabled
mv ~/Library/LaunchAgents/com.example.label.plist ~/Library/LaunchAgents/Disabled/
launchd 只讀取直接位於 LaunchAgents 檔案夾中的檔案,不讀取子檔案夾,所以下次登入時工作不會被載入。檔案仍在,需要時隨時可用。如果 App 重新建立 plist,工作就會回來;選項 A 可以避免這種情況。
選項 C:系統設定
許多工作也會出現在系統設定 › 一般 › 登入項目與延伸功能 › 允許在背景執行中。在那裡關閉開關也有效,但一個開關可能同時控制同一開發者的多個工作。請參閱「允許在背景執行」是什麼意思。
步驟 6:確認是否生效
launchctl list | grep com.example.label
沒有輸出代表它沒有被載入。為了保險起見,請重新開機後再執行一次。
復原
如果你使用了選項 A:
launchctl enable gui/$(id -u)/com.example.label
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.label.plist
如果你使用了選項 B,請把檔案移回原處,然後執行同一行 bootstrap 指令。常駐程式請加上 sudo,並用 system 取代 gui/$(id -u)。
網路上常見的舊指令
launchctl unload -w file.plist 和 launchctl load -w file.plist 仍然可用,但 Apple 將它們列為舊版指令。bootout、bootstrap、disable 和 enable 才是目前的指令,而且錯誤訊息也更清楚。
常見問題
刪除 LaunchAgents 中的檔案安全嗎?
停用比刪除更安全。刪除 plist 並不會停止已經載入的工作,而且如果之後需要,檔案也找不回來了。請使用 launchctl bootout 和 launchctl disable,或將檔案移到備份檔案夾。
我應該使用 launchctl unload -w 嗎?
它仍然可用,但 Apple 已將 load 和 unload 標示為舊版指令。在目前的 macOS 上,請用 launchctl bootout 停止工作,用 launchctl disable 讓它保持關閉。
我可以停用 /System/Library 中的 Apple 啟動代理程式嗎?
請不要這樣做。它們是 macOS 的一部分,檔案受到系統完整性保護,停用它們可能會導致 iCloud、Spotlight 或更新等功能失效。
如何復原 launchctl disable?
執行 launchctl enable gui/$(id -u)/<label>,然後以 plist 路徑執行 launchctl bootstrap gui/$(id -u),或是登出後再重新登入。
App 又把它的啟動代理程式放回來了,怎麼辦?
使用 launchctl disable。它停用的是標籤本身,所以即使 App 重新寫入 plist,它仍會保持關閉。同時也請關閉 App 本身的「登入時啟動」設定。