在Mac OS X中,有三種方式來實作啟動項的配置:1)Login Items;2)StartupItems;3)launchd daemon。
打開System Preferences,選擇System -> Accounts,選擇Login Items頁籤,将/Applications目錄下的.app直接拖進右邊的清單中。重新開機電腦之後就會發現清單中的程式在開機之後就自動啟動了。
StartupItems,顧名思義,就是在系統啟動過程中運作的程式,它們可以是運作完就立即終止的程式(比如,開機清空廢紙簍),也可以是一直持續在系統運作周期的背景程序。
StartupItems一般存放在以下兩個路徑下:
1)/System/Library/StartupItems
2)/Library/StartupItems
大部分與系統相關的StartupItems都放在/System/Library/StartupItems這個路徑下,它們會先于/Library/StartupItems路徑下的執行,因為前者路徑下的StartupItems提供了系統級的基礎服務,比如crash reporting,core graphics services,system accounting等,而後者路徑在預設情況下是不存在的,需要自己手動建立。
這裡我們以/Library/StartupItems目錄下的IcebergControlTower為例。
簡單來說,在Mac OS X上,一個StartupItems包含以下兩個方面的内容:
1)可執行程式;
2)包含依賴程序關系的plist檔案(StartupParameters.plist)。
StartupParameters.plist 是一個屬性清單,包含了運作可執行程式的必要條件。
該plist需要獲得root權限,包含了幾個方面的内容:
1)Description;
對該服務的一個簡單的描述,僅僅是描述,并不是說明實際的程序名稱。
2)Provides;
指定StartupItems提供的服務。如圖plist檔案Provides中說明,StartupItems開啟的背景程序名為:Iceberg Control Tower。
Provides可以指定多個服務,反映在圖中就是Item0,Item1…等。這裡隻有Item0。
3)Uses;
指定了在StartupItems加載之前需要開啟的服務。Mac OS X系統先嘗試着加載Uses中指定的服務,然後再加載StartupItems。也就是說,即使Uses中指定的服務沒有加載成功,系統仍然會加載StartupItems。
4)OrderPreference;
指定執行StartupItems的時間順序。這個順序的重要程度排在Uses之後,是指定執行完Uses之後的順序。可能的取值包括:First, Early, None(default), Late, Last。
5)Messages。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Description</key>
<string>Iceberg Control Tower Initilaization</string>
<key>Provides</key>
<array>
<string>Iceberg Control Tower</string>
</array>
<key>Uses</key>
<string>Disks</string>
<key>OrderPreference</key>
<string>None</string>
</dict>
</plist>
注意:1)可執行檔案的名稱和它所在的檔案夾的檔案名是一樣的,這是系統預設的規則。
2)操作可執行檔案需要獲得root權限。
3)可執行檔案是一個shell腳本。
打開IcebergControlTower檔案目錄下同名的可執行檔案,可以看到腳本的具體内容:
一般的可執行檔案包含這樣幾個方面的内容:
1)./etc/rc.common
Apple提供的一個腳本庫,該腳本庫裡包含了為可執行檔案引進參數的接口。在這裡load這個庫主要是調用RunService。
2)StartService(), StopService(), RestartService()
當可執行檔案接收到的參數為start,stop或者restart時,執行相對應的函數。
參數含義:
start:開機過程中開啟服務;
stop:關機過程中停止服務;
restart:在特定條件下重新開機服務。
3)RunService “$1”
執行傳遞給該腳本的第一個參數指定的服務。
“$1” 表示傳給該腳本的第一個參數。例如,傳入的參數為start,則執行StartService()。
launchd是Mac OS下用于初始化系統環境的關鍵程序,它是核心裝載成功之後在OS環境下啟動的第一個程序。
采用這種方式來配置自啟動項很簡單,隻需要一個plist檔案,通常(同時也是系統推薦)是将plist放在~/Library/LaunchAgents路徑下。
1)Label【required】
該項服務的名稱。
2)OnDemand【optional】
10.4提供的一個key值,功能與KeepAlive的基本功能相似,在10.5及之後的系統中被KeepAlive替代。KeepAlive擴充了更多的功能,除了使用單一的boolean作為key值之外,還能使用字典結合多個key值。
3)Program【ProgramArgument是required的,在沒有ProgramArgument的情況下,必須要包含Program這個key】
指定可執行檔案的路徑。
4)RunAtLoad【optional】
辨別launchd在加載完該項服務之後立即啟動路徑指定的可執行檔案。預設值為false。
5)WorkingDirectory【optional】
該key在開啟可執行檔案之前,指定目前工作目錄的路徑。
6)KeepAlive【optional】
這個key值是用來控制可執行檔案是持續運作呢,還是滿足具體條件之後再啟動。預設值為false,也就是說滿足具體條件之後才啟動。當設定值為ture時,表明無條件的開啟可執行檔案,并使之保持在整個系統運作周期内。
<key>Label</key>
<string>com.yourcompany.HSPA_USB_MODEM</string>
<key>OnDemand</key>
<false/>
<key>Program</key>
<string>/Application/HSPA USB MODEM.app/Running</string>
<key>RunAtLoad</key>
<true/>
<key>WorkingDirectory</key>
<string>/Application/HSPA USB MODEM.app</string>
總的來說,LoginItems 和StartupItems的差別較明顯。
StartupItems
LoginItems
Depedency Ordering
Need
Do not Need
Load Timing
during startup
after a user logs in
Launched by WHO
by root, but not necessarily
the user
Processes types
background processes and processes that terminate after running
any Mac OS X executable
對于我們自定義的Launchd daemon,通常(同時也是系統推薦)是放在~/Library/LaunchAgents路徑下。launchd程序需要在使用者login之後才能加載。這種方式與LoginItems最大的差別在于,啟動的程序不同。LoginItems是通過loginwindow去啟動的,而Launchd daemon是通過com.apple.launchd.peruser啟動。