天天看點

Mac OS啟動服務優化進階篇(launchd tuning)如何在Mac OS X上建立一個Service服務程序建立Launch Daemon

Mac下的啟動服務主要有三個地方可配置:

1,系統偏好設定->帳戶->登陸項

2,/System/Library/StartupItems 和 /Library/StartupItems/

3,launchd 系統初始化程序配置。

前兩種優化比較簡單,本文主要介紹的是第三種更為複雜的launchd配置優化。launchd是Mac OS下,用于初始化系統環境的關鍵程序。類似Linux下的init, rc。

我們先來看一下Mac OS X的啟動原理:

1,mac固件激活,初始化硬體,加載BootX引導器。

2,BootX加載核心與核心擴充(kext)。

3,核心啟動launchd程序。

4,launchd根據  /System/Library/LaunchAgents , /System/Library/LaunchDaemons ,  /Library/LaunchDaemons, Library/LaunchAgents , ~/Library/LaunchAgents 裡的plist配置,啟動服務守護程序。

看完了Mac OS X的啟動原理,我們不難發覺 /System/Library/LaunchAgents , /System/Library/LaunchDaemons ,  /Library/LaunchDaemons, Library/LaunchAgents 五個目錄下的plist屬性檔案是優化系統的關鍵。

下面再來了解幾個基礎概念:

/System/Library和/Library和~/Library目錄的差別?

/System/Library目錄是存放Apple自己開發的軟體。

/Library目錄是系統管理者存放的第三方軟體。~/Library/是使用者自己存放的第三方軟體。

LaunchDaemons和LaunchAgents的差別?

LaunchDaemons是使用者未登陸前就啟動的服務(守護程序)。

LaunchAgents是使用者登陸後啟動的服務(守護程序)。

開始優化

禁用服務,我們需要用到Mac OS提供的一個工具指令-launchctl

launchctl 指令會針對服務設定一個禁用标志,launchd啟動時會先檢查這個服務是否被禁用,進而确定是否需要啟用這個服務。

禁用服務的方法1

先找到禁用标志檔案 /var/db/launchd.db/com.apple.launchd/overrides.plist,檢視你要禁用的服務是否已被禁用了。

有些服務已被禁用,但未列在overrides.plist裡。此時,你還需要檢查這個服務的plist檔案Label字段是否已經标記為 Disable。

确認這個服務未禁用後,我們就可以通過調用如下指令,來禁用服務:

sudo launchctl unload plist檔案路徑

sudo launchctl unload -w plist檔案路徑

比如,我想禁用spotlight,則輸入

sudo launchctl unload /System/Library/LaunchAgents/com.apple.Spotlight.plist

sudo launchctl unload -w /System/Library/LaunchAgents/com.apple.Spotlight.plist

禁用完服務以後,重新開機Mac OS即可生效。

禁用服務的方法2,一種更有效且暴力的方法(推薦)

先解除安裝服務

sudo launchctl unload /System/Library/LaunchAgents/com.apple.Spotlight.plist

然後将plist檔案mv到其他目錄備份。

sudo mv /System/Library/LaunchAgents/com.apple.Spotlight.plist ~/launchd.bak

重新開機。搞定。是不是很簡單!

我個人比較喜歡這種禁用服務的方式,是以推薦一下。

最後,如果發現服務禁用後,系統或軟體出現異常,可以通過如下指令,還原服務:

方法1:

sudo launchctl load -wF plist檔案路徑

方法2:

将備份的plist檔案mv回原來的檔案夾。

sudo launchctl load plist檔案路徑

注意:系統級服務的禁用要異常小心,請在禁用前google,確定你熟知這個服務的作用。否則可能導緻系統無法啟動。

最安全的做法就是不要去禁用它了。

當然,使用者服務我們還是可以放心禁用的,有問題最多再啟用呗。

下面是我禁用的服務清單:

/System/Library/LaunchDaemons/com.apple.metadata.mds.plist (禁用spotlight的前提)

/System/Library/LaunchAgents/com.apple.Spotlight.plist (Spotlight)

/Library/LaunchDaemons/com.google.keystone.daemon.plist  (Google Software Update)

/Library/LaunchAgents/com.google.keystone.root.agent  (Google Software Update)

~/Library/LaunchAgents/com.google.keystone.agent.plist (Google Software Update,使用者下的程序不需要加 sudo)

~/Library/LaunchAgents/com.apple.CSConfigDotMacCert-ken.wug\@me.com-SharedServices.Agent.plist (me.com的共享服務,我不用)

/System/Library/LaunchDaemons/org.cups.cupsd.plist (列印機)

/System/Library/LaunchDaemons/org.cups.cups-lpd.plist (列印機)

/System/Library/LaunchDaemons/com.apple.blued.plist (藍牙)

/System/Library/LaunchAgents/com.apple.AirPortBaseStationAgent.plist (apple無線基站,我沒有這個裝置)

順便給大家介紹一些常見程序:

UserEventAgent 提供使用者區程式的事件通知。

TISwitcher 輸入法切換。

SystemUIServer 頂部菜單欄。

Dock 底部菜單欄。。

loginwindow window登陸程序,登出什麼的。

launchd 不用說了,系統主程序。

fontd 字型程序。

bash shell環境主程序,終端。

Airport基站代理 顧名思義。

pboard 剪貼闆,就是複制黏貼。

CCacheServer Kerberos tickets 安全子產品,緩存了一些票據,類似密鑰。

cvmsComp 跟opengl相關的程序。

kextd 核心擴充服務。

notifyd 系統内消息服務。

diskarbitrationd 磁盤監控服務,響應usb移動硬碟插入,移除等事件。

configd 系統配置,狀态監控服務。

syslogd 系統日志。

DirectoryService 檔案系統權限驗證。

distnoted 外部消息服務,比如iphone, ipad與mac的連接配接。

ntpd 時間服務。

usbmuxd USB支援。

securityd 安全鑰匙。

mDNSResponder DNS支援。

KernelEventAgent 核心事件響應。

hidd 人體工程學設定支援。

fseventsd FSEvent檔案系統事件支援。

dynamic_pager 虛拟記憶體。swap。

dpd display port支援。

autofsd 自動mount網絡檔案系統。

coreservicesd 核心服務程序。

coreaudiod 音頻服務程序。

WindowServer UI界面。

ocspd 對OCRs的安全協定支援。

autofsd 自動mount檔案系統,配置在 /etc/auto_master

運作Xcode,建立一個簡單的指令行應用WebTwainService。

<a href="http://my.oschina.net/yushulx/blog/306339">?</a>

<code>#import &lt;Foundation/Foundation.h&gt;</code>

<code> </code> 

<code>int</code> <code>main(</code><code>int</code> <code>argc, </code><code>const</code> <code>char</code> <code>* argv[])</code>

<code>{</code>

<code>    </code><code>@autoreleasepool {</code>

<code>        </code><code>// insert code here...</code>

<code>        </code><code>NSLog(@</code><code>"Hello, World!"</code><code>);</code>

<code>    </code><code>}</code>

<code>    </code><code>while</code> <code>(1)</code>

<code>    </code><code>{</code>

<code>        </code><code>sleep(100);</code>

<code>    </code><code>return</code> <code>0;</code>

<code>}</code>

編譯工程,把WebTwainService放到/Applications/Dynamsoft/WebTwainService.

Mac OS啟動服務優化進階篇(launchd tuning)如何在Mac OS X上建立一個Service服務程式建立Launch Daemon

StandardErrorPath &amp; StandardOutPath: service日志檔案路徑

KeepAlive. 設定成true. 一旦WebTwainService異常崩潰, 系統會自動重新開機服務。

Label: 一個唯一值

ProgramArguments: 可執行檔案路徑

這個plist配置檔案可放置的地方包括:

~/Library/LaunchAgents

/Library/LaunchAgents

/Library/LaunchDaemons

/System/Library/LaunchAgents

/System/Library/LaunchDaemons

把com.dynamsoft.WebTwainService.plist放到/Library/LaunchDaemons下。

要成功注冊服務,還必須修改目錄權限:sudo chown root  /Library/LaunchDaemons/com.dynamsoft.WebTwainService.plist.

指令行中輸入sudo launchctl運作launchd

注冊服務load -D system /Library/LaunchDaemons/com.dynamsoft.WebTwainService.plist。然後我們可以看到服務被加載了:

Mac OS啟動服務優化進階篇(launchd tuning)如何在Mac OS X上建立一個Service服務程式建立Launch Daemon

輸入list可以檢視運作的程序

Mac OS啟動服務優化進階篇(launchd tuning)如何在Mac OS X上建立一個Service服務程式建立Launch Daemon

現在重新開機系統,然後打開日志/var/log/webtwain.log,檢視服務是否在運作了:

Mac OS啟動服務優化進階篇(launchd tuning)如何在Mac OS X上建立一個Service服務程式建立Launch Daemon

技術改變世界!

--狂詩絕劍

繼續閱讀