[Mac] Mac 上開機/登入時會自動執行的程式在哪裡?
平常會用 BetterTouchTool 這個工具來最大化 Mac 的視窗,
不過偶爾會發現這個工具沒有被自動跑起來,雖然我已經設定成登入時自動執行了…
今天正想來找這問題時,又發現這問題無法重現了 (工程師的宿命 =_=)…
不過還是查到了一篇蠻有用的資料,可以記錄一下~
基本上是參考了 Take control of startup and login items 這篇文章,
文章裡對 Mac 的 login items, startup items 有個基本的介紹,
蠻建議來看一下這篇文章,可以快速地對 Mac 開機/登入時會執行的程式有些初步了解~
下面就來順便做些實驗吧~
1. 電腦開機時自動執行 – Startup Items
這是 Apple 已經不建議使用的方式:將開機要執行的東西放在 StartupItems 目錄下。
– /System/Library/StartupItems: 放 OS X 作業系統自帶的東西
– /Library/StartupItems: 放非作業系統自帶的東西
在我的 Mac 上面,這兩個目錄都是空的~
2. 電腦開機時自動執行 – Launch Daemons
這是 Apple 目前建議的方式:將開機要執行的東西交給 launchd 管理。
開機時要執行的程式會放在這兩個目錄:
– /System/Library/LaunchDaemons:放 OS X 作業系統自帶的東西
– /Library/LaunchDaemons:放非作業系統自帶的東西
舉例來說,TeamViewer 如果沒有開啟開機自動執行的選項時:
/Library/LaunchDaemons/com.teamviewer.teamviewer_service.plist 的內容如下,
可以看到 Disabled 這個 key 的值是 true:
<?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>Disabled</key> <true/> <key>KeepAlive</key> <true/> <key>Label</key> <string>com.teamviewer.service</string> <key>ProgramArguments</key> <array> <string>/Applications/TeamViewer.app/Contents/MacOS/TeamViewer_Service</string> <string>-Module</string> <string>Full</string> </array> <key>RunAtLoad</key> <true/> <key>WorkingDirectory</key> <string>/Applications/TeamViewer.app/Contents/MacOS</string> </dict> </plist>
當 Start TeamViewer with System 的選項有勾選時:
/Library/LaunchDaemons/com.teamviewer.teamviewer_service.plist 的內容如下,
可以看到 Disabled 這個 key 的值變成 false 了,同時 plist 檔裡也加了更多的資訊:
<?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>Disabled</key> <false/> <key>KeepAlive</key> <true/> <key>Label</key> <string>com.teamviewer.desktop</string> <key>LimitLoadToSessionType</key> <array> <string>LoginWindow</string> <string>Aqua</string> </array> <key>ProgramArguments</key> <array> <string>/Applications/TeamViewer.app/Contents/Resources/TeamViewer_Desktop</string> <string>-RunAsAgent</string> <string>YES</string> <string>-Module</string> <string>Full</string> </array> <key>RunAtLoad</key> <true/> <key>WorkingDirectory</key> <string>/Applications/TeamViewer.app/Contents/Resources</string> </dict> </plist>
3. 使用者登入時自動執行 – Login Items
這邊是一般使用者可以很容易控制的項目,
只要到 System Preferences > Users & Groups,找到要查看的使用者,
點下上方的 Login Items,就可以看到當這使用者登入時會執行的程式~
舉例來說,BetterTouchTool 的自動執行方式就是 Login Items~
如果把 Launch BetterTouchTool on startup 勾選的話,
可以看到 BetterTouchTool 就會出現在 Login Items 項目中:
當不勾選時,BetterTouchTool 就從 Login Items 中被移掉了:
如果是在 command line 模式下的話,可以用 defaults 指令查出列表:
testuser@localhost ~ $ defaults read com.apple.loginitems
{ SessionItems = { Controller = CustomListItems; CustomListItems = ( { Alias = <00000000 00ba0003 00010000 cd650ada 0000482b 00000000 010460a0 011014d4 0000d062 fe5e0000 00000920 fffe0000 00000000 0000ffff ffff0001 00040104 60a0000e 00280013 00420065 00740074 00650072 0054006f 00750063 00680054 006f006f 006c002e 00610070 0070000f 001a000c 004d0061 00630069 006e0074 006f0073 00680020 00480044 00120020 4170706c 69636174 696f6e73 2f426574 74657254 6f756368 546f6f6c 2e617070 00130001 2f00ffff 0000>; CustomItemProperties = { "com.apple.LSSharedFileList.Binding" = <646e6962 00000000 02000000 00000000 00000000 00000000 00000000 29000000 00000000 66696c65 3a2f2f2f 4170706c 69636174 696f6e73 2f426574 74657254 6f756368 546f6f6c 2e617070 2f1d0000 00000000 00636f6d 2e686567 656e6265 72672e42 65747465 72546f75 6368546f 6f6c0000 000000f4 05008e40 10100200 00005e85 ed19>; "com.apple.LSSharedFileList.ItemIsHidden" = 0; }; Name = "BetterTouchTool.app"; } ); }; }
也可以用 osascript 秀出更簡潔的列表 (參考這篇文章):
testuser@localhost ~ $ osascript -e 'tell application "System Events" to get the name of every login item' BetterTouchTool
4. 使用者登入時自動執行 – Launch Agents
這部分類似 Launch Daemons,也是由 launchd 來管理的,
但管理的是使用者登入時要執行的程式~
要執行的程式會放在這幾個目錄:
– /System/Library/LaunchAgents:放 OS X 作業系統自帶的東西
– /Library/LaunchAgents:放非作業系統自帶的東西,任何使用者登入時都會執行
– ~/Library/LaunchAgents:放非作業系統自帶的東西,目前使用者登入時會執行
文章也有提到自動執行的東西不只這些,
還有 kernel extension, cron job, login script 等等…
目前的了解大概是這樣子,有更深入了解的話再來分享囉~^^