如何在 Mac 上使用 Launchd 安排運行腳本

如何在 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-腳本-作業描述

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 中

launchd-scripts-launchctl-列表

創建腳本並將代理保存在正確的位置後,您需要將其加載到launchctl. 這將在將來登錄時自動發生。

要查看 laucnhctl 當前正在運行的內容,您可以launchctl list在終端中使用。可以通過使用如下所示的標籤來對這個巨大的列表進行 grep 以查找您的腳本:

launchctl list | grep local.restart

要加載腳本,請打開終端,然後使用以下命令:

launchctl load ~/Library/LaunchAgents/local.restart.plist

launchd-腳本-launchctl-加載

要從 launchctl 隊列中刪除腳本,請使用以下unload命令:

launchctl unload ~/Library/LaunchAgents/local.restart.plist

launchd-腳本-launchctl-卸載

加載作業會將其放入啟動隊列中,並且該作業將在其啟動條件中指定的時間運行。如果無論如何你想立即運行腳本,你應該使用“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 製作。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *