2016年1月6日

Mac - 使用 Launchd 管理例行性任務 ( Use Launchd to manage and execute routine tasks on Mac OS X )

Launchd 是設計用來管理系統中的 Process、Application 及 Script,它包含了與 Cron 相同的服務。本文章將要介紹如何透過 Launchd 管理並執行例行性任務於 Mac OS X 上。( 其他 Mac 相關教學可以參考本篇整理 。If you want to read this article in English, you can visit here )



瞭解 Launchd:
基本上 Launchd 是透過 *.plist 檔案得知有哪些東西需要管理,所以若要新增任務給 Launchd,我們要新增一個任務定義檔 ( 即 plist 檔案 ),該檔案描述程式名稱、所在位置、執行方式等等。為了方便使用者操作 Launchd,它提供了 Launchctl 工具讓我們可以即時對 Launchd 下達指令。而 Launchd 根據任務的層級規劃了不同的資料夾來存放任務定義檔,文件中對資料夾描述分別為:
~/Library/LaunchAgents           Agents provided by the user.
 /Library/LaunchAgents           Agents provided by the administrator.
 /Library/LaunchDaemons          System daemons provided by the administrator.
 /System/Library/LaunchAgents    Agents provided by Apple.
 /System/Library/LaunchDaemons   System daemons provided by Apple.
對於使用者自訂的任務,幾乎不需要使用到 /System 開頭的資料夾,所以通常將任務定義檔放置其他的資料夾即可。


建立任務定義檔:
假設我需要在每天的 14:30 執行某個 Shell Script。首先,建立檔案 ( 檔名如:com.myname.launch.some.program.plist ),並定義內容:

建立好後將檔案放置於對應層級的資料夾即可,如範例這個 Script 只有我需要執行,則放置於 ~/Library/LaunchAgents


使用 Launchctl:
任務內容設定好後,我們可以透過 Launchctl 將該任務載入 ( 讓 Launchd 知道有新的任務加入 ),指令:
# 載入任務
launchctl load ~/Library/LaunchAgents/com.myname.launch.some.program.plist

# 移除任務
launchctl unload ~/Library/LaunchAgents/com.myname.launch.some.program.plist

# 手動執行任務
launchctl start com.myname.launch.some.program

# 列出所有任務
launchctl list
需要注意的是,你可以藉由 launchctl list 這個指令看到任務的狀態 ( status 欄位 ),若出現非 0 的狀態碼代表任務發生錯誤,可以使用 launchctl error [錯誤碼] 來查詢。


Environment :
  ・ Mac OS X
Reference :
  ・ Launchd


熱門文章