天天看點

三種方式配置Mac OS X的啟動項

在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啟動。

繼續閱讀