如何在 Mac 上使用 Launchd 安排運行腳本
通過調度腳本自動執行任務是許多管理員每天依賴的強大功能。普通 Mac 用戶還可以使用 launchd 來利用這種強大功能,launchd 是 Apple 在 macOS 上用於任務自動化和管理的首選工具。從安排簡單的任務(例如在特定時間關閉 Wi-Fi)到運行複雜的系統備份,Mac 上的 launchd 可以幫助您自動化工作流程、節省時間並確保系統按照您喜歡的方式運行。
什麼是啟動?
就像管弦樂隊需要指揮來指導和協調不同的樂器一樣,macOS Ventura擁有無數的流程和服務,依靠 launchd 來確保一切都完美地演奏。作為啟動計算機時 macOS 內核啟動的第一個進程,launchd 佔據中心舞台,編排每個後續進程、服務和應用程序,就像指揮家用最初的指揮棒發出信號,表示交響樂開始。
除了在系統編排中的作用之外,launchd 還可用於調度腳本,即為執行特定任務而編寫的一系列命令。這是使用launchctl
命令完成的,該命令充當用戶與啟動的指揮進行通信和指揮的界面。
守護進程和代理
launchd 有時被稱為守護進程,它是一種作為後台進程運行的計算機程序,通常不設計為由用戶直接控制。就守護進程而言,launchd 是特殊的,因為它是所有其他 macOS 守護進程的大師,並且它可以決定它們何時啟動和停止。這些從屬守護進程在 root 用戶下運行,因此它們幾乎可以執行任何操作。
然而,作為對任務調度感興趣的用戶,在 root 用戶下運行腳本並不總是可取或必要的。這就是代理髮揮作用的地方。代理代表登錄用戶運行,提供更受限制的環境,並確保使用該特定用戶的權限和首選項執行腳本或任務。例如,如果您希望運行一個腳本來更改設置或訪問您帳戶中的文件,您可以使用代理。
編寫腳本
要通過 launchd 運行代理或守護程序,您需要編寫一些腳本。最常見的腳本語言是 bash。如果您想了解有關 bash 腳本編寫的更多信息,可以查看我們的bash 腳本編寫初學者指南。
您的 launchd 腳本可以駐留在兩個不同的位置,具體取決於它們是作為代理還是守護程序運行:
- 對於那些代表登錄用戶運行的代理腳本,它們應該存儲在“~/Library/LaunchAgents”中。
- 相反,無論登錄用戶如何,旨在在操作系統範圍內充當守護程序的腳本都屬於“/Library/LaunchDaemons”。
請記住,代理沒有根權限,因此他們無法執行需要深度系統訪問的任務。另一方面,守護進程以 root 權限運行,可以處理影響整個系統的任務。
工作介紹
launchd 中的腳本是由作業定義觸發的。plist 文件存儲在特定目錄中。這些 XML 文件為作業提供名稱,指定應啟動的腳本,並指示應運行腳本的時間。編寫腳本後,您將編寫並加載在適當時間啟動腳本的作業定義。工作定義看起來像這樣:
<?xml version="1.0"encoding="UTF-8"?><!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd"><plist version="1.0">
<dict>
<key>Label</key>
<string>local.restart</string>
<key>Program</key>
<string>/Users/user/Scripts/restart.sh</string>
<key>RunAtLoad</key>
<true/>
</dict></plist>
根據需要進行修改,然後將其放入文本文件中。plist 擴展名,然後將其放入正確的目錄(見上文)。
職位描述有幾個關鍵部分:
- 標籤: launchd 中作業的名稱。每項工作都必須是唯一的。這些都是用反向域表示法編寫的,“本地”對於私人代理來說是一個很好的域。
- 程序:此職位描述啟動的腳本的完整路徑。
- RunAtLoad:描述何時應運行腳本。這裡有幾個不同的選項:
- RunAtLoad:加載作業定義後立即運行。每個負載僅運行一次。
- StartInterval:每n秒啟動一次作業。此示例將每 7200 秒或每 2 小時運行一次作業。
<key>StartInterval</key> <integer>7200</integer>
- StartCalendarInterval:在特定時間和日期運行作業。以下代碼將在每天上午 9 點運行該作業。
<key>StartCalendarInterval</key> <dict> <key>Hour</key> <integer>9</integer> <key>Minute</key> <integer>0</integer> </dict>
將作業加載到 launchctl 中
創建腳本並將代理保存在正確的位置後,您需要將其加載到launchctl
. 這將在將來登錄時自動發生。
要查看 laucnhctl 當前正在運行的內容,您可以launchctl list
在終端中使用。可以通過使用如下所示的標籤來對這個巨大的列表進行 grep 以查找您的腳本:
launchctl list | grep local.restart
要加載腳本,請打開終端,然後使用以下命令:
launchctl load ~/Library/LaunchAgents/local.restart.plist
要從 launchctl 隊列中刪除腳本,請使用以下unload
命令:
launchctl unload ~/Library/LaunchAgents/local.restart.plist
加載作業會將其放入啟動隊列中,並且該作業將在其啟動條件中指定的時間運行。如果無論如何你想立即運行腳本,你應該使用“start”命令:
launchctl start local.restart
此命令採用作業的標籤,並且僅在作業已加載到launchctl
.
經常問的問題
如何檢查 launchd 是否已啟動腳本?
launchctl list
您可以在終端中使用該命令。這將顯示所有加載的作業。要查找特定腳本或作業,請使用grep
,例如launchctl list | grep your_script_name
。
如果 launchd 使用太多系統資源怎麼辦?
如果 launchd 消耗過多資源,通常是由於腳本或作業行為不當造成的。您應該檢查最近添加的腳本,並使用 卸載它們launchctl unload /path/to/job.plist
。
cron 和 launchd 有什麼區別?
cron 和 launchd 都是調度服務,但操作方式不同。cron 是一個基於 Unix 的舊作業調度程序,它按 crontab 文件中定義的固定時間或間隔運行作業。launchd 是 Apple 針對 macOS 的較新系統,它可以根據各種觸發器(而不僅僅是時間)啟動作業。
除了 bash 之外,我還可以在 launchd 中使用其他腳本語言嗎?
launchd 可以執行任何可以從終端運行的腳本。這包括用 Python、Perl、Ruby 和其他語言編寫的腳本。
圖片來源:Pexels。所有屏幕截圖均由 David Morelo 製作。
發佈留言