Mac 上的 LaunchAgents 和 LaunchDaemons 是什麼,哪些可以刪
LaunchAgents 和 LaunchDaemons 是放著許多小型 .plist 檔案的資料夾,用來告訴 macOS 的 launchd 要在背景啟動什麼、什麼時候啟動。Agent 為單一登入的使用者執行,可以在畫面上顯示東西,Daemon 為整個系統執行,沒有使用者介面。通常可以移除你已經不用的 App 留下的第三方項目,/System/Library 不要動,搬動檔案之前要先停掉對應的任務。
五個資料夾
Apple 的 launchd 說明列出了這些位置:
| 資料夾 | 放什麼 | 能不能動 |
|---|---|---|
~/Library/LaunchAgents |
只屬於你帳號的第三方 Agent | 可以,要小心 |
/Library/LaunchAgents |
所有使用者共用的第三方 Agent | 可以,需要管理員密碼 |
/Library/LaunchDaemons |
第三方的系統 Daemon | 可以,需要管理員密碼 |
/System/Library/LaunchAgents |
Apple 的 Agent | 不要 |
/System/Library/LaunchDaemons |
Apple 的 Daemon | 不要 |
man launchd 劃出了界線:Daemon 是整個系統共用的服務,所有用戶端共用一個執行個體,而且不該顯示使用者介面。Agent 則是每位使用者各跑一份,需要和使用者互動的工作應該放在這裡。實際上,選單列的輔助程式或更新程式多半是 Agent,VPN 服務、音訊驅動的輔助程式或備份引擎多半是 Daemon。
不是每個背景項目在這裡都有檔案。App 可以把 plist 放在自己的 bundle 裡面,所以 系統設定 › 一般 › 登入項目與延伸功能可能列出這些資料夾裡沒有的東西。如何停止 App 在開機時自動開啟會說明那個畫面。
判斷之前先讀一遍
ls -la ~/Library/LaunchAgents /Library/LaunchAgents /Library/LaunchDaemons
plutil -p ~/Library/LaunchAgents/com.example.helper.plist
有四個鍵,就能看出大半的來龍去脈:
| 鍵 | 意義 |
|---|---|
Label |
任務的名稱,launchctl 用的就是這個 |
Program 或 ProgramArguments |
它要執行什麼,要檢查的就是這個路徑 |
RunAtLoad |
任務一載入就啟動,通常是在登入或開機時 |
KeepAlive |
它停止後 launchd 會再把它啟動,所以手動結束沒有用 |
上面的 com.example.helper 只是示範用的名稱,請換成你自己檔案的名稱。如果 ProgramArguments 指向你已經移除的 App,那個檔案就是殘留,可以放心拿掉。如果它指向你還在用的 App,移除它可能讓那個 App 的更新、同步、授權、VPN 或音訊壞掉。
怎麼移除
先停掉任務。把檔案搬走並不會停掉已經在跑的任務,它會一直載入到登出或重新開機。
你帳號裡的 Agent:
launchctl bootout gui/$(id -u)/com.example.helper
mv ~/Library/LaunchAgents/com.example.helper.plist ~/.Trash/
/Library/LaunchDaemons 裡的 Daemon:
sudo launchctl bootout system/com.example.helper
sudo mv /Library/LaunchDaemons/com.example.helper.plist ~/.Trash/
/Library/LaunchAgents 裡的 Agent 會載入到每位使用者的工作階段,所以用 gui/$(id -u)/ 的形式來停止它,並用 sudo mv 搬動檔案。指令裡請使用 Label 的值,它可能和檔名不同。
用 launchctl print gui/$(id -u)/com.example.helper 或 sudo launchctl print system/com.example.helper 確認它已經不在了,應該會回報找不到這個服務。然後正常使用那個 App 一天,如果有東西壞了,就把檔案放回去再重新開機。
如果想保留檔案,只是不讓任務載入:
launchctl disable gui/$(id -u)/com.example.helper
launchctl print-disabled gui/$(id -u)
用同一個目標執行 launchctl enable 就能還原。
不要這樣做
- 不要動
/System/Library/LaunchAgents或/System/Library/LaunchDaemons,它們放在唯讀的系統磁碟區上,屬於 macOS。 - 不要只憑公司名稱就刪。以資安產品或裝置驅動程式命名的檔案,可能正是該產品能正常運作的關鍵,在受管理的 Mac 上也可能是公司政策。
- 不要移除你還在用的 App 的 plist,還以為只會少掉更新提醒。先看 App 自己的設定。
- 不要用舊教學裡寫的
launchctl unload,Apple 的手冊把它列為舊式子指令,現在的寫法是bootout。
Mole 能幫上什麼
Mole 的軟體分頁有個啟動項目區段,會列出這些項目,讀取每個 plist 自己的 Label,並用擁有它的 App 來命名輔助程式。它會把項目分到登入項目和背景服務這類標題下,當某個任務指向已不存在的東西時,標示程式缺失,這通常就是殘留的徵兆。對於 ~/Library/LaunchAgents、/Library/LaunchAgents 或 /Library/LaunchDaemons 裡經過檢查的 launchd plist,你可以用該列的開關把它關掉、再打開,或移到垃圾桶,Mole 會先停掉任務。資安和管理類產品會維持鎖定,無法安全更改的項目則會開啟系統設定。當狀態裡有個行程看起來陌生時,為什麼在執行?會指出 launchd 服務和它的 plist。透過 Mole 解除安裝 App 時,也會讓你一併檢視它的啟動項目。
常見問題
刪除 LaunchAgents 裡的檔案安全嗎?
對已移除 App 留下的殘留是安全的,對你還在用的 App 有時就不安全。先用 plutil -p 讀 ProgramArguments,並在把檔案移到垃圾桶之前,先用 launchctl bootout 停掉任務,這樣才放得回去。
LaunchAgent 和 LaunchDaemon 有什麼差別?
Agent 為每位登入的使用者執行,可以和該使用者互動。Daemon 在整個系統只有一個執行個體,通常在任何人登入之前就啟動,沒有使用者介面。
為什麼移除的 LaunchAgent 又回來了?
安裝它的 App 還在這台 Mac 上,下次開啟或更新時又把它寫回去了。要在 App 裡關掉那個功能,或解除安裝 App,只刪檔案撐不久。
LaunchAgent 可能是惡意軟體嗎?
可能。常駐的廣告軟體常裝在這裡,因為這樣重新開機後還能存活。Label 看不懂,又執行隱藏資料夾或暫存路徑裡的東西,就值得多看一眼,搜尋那個確切的路徑,並檢查程式是誰簽署的。
移除之後需要重新開機嗎?
如果你用了 launchctl bootout 就不需要,它會立刻停掉。如果只是搬走檔案,任務會一直載入到你登出或重新開機。