[英]Launch shell script on login in Mac OS (OS X)
我有這個 shell 腳本Test.sh
:
#! /bin/bash
FILE_TO_CHECK="/Users/test/start.txt"
EXIT=0
while [ $EXIT -eq 0 ]; do
if [ -f "$FILE_TO_CHECK" ]
then
/usr/bin/java -jar myapp.jar
EXIT=1
else
sleep 30
fi
done
我需要在登錄后自動啟動這個腳本。
所以我把它放在/System/Library/StartupItems/
的文件夾Test
中
當我重新啟動 Mac 時,登錄后沒有任何反應。有任何線索嗎?
我也試過Automator
,但結果相同:java 程序沒有運行。
Ivan Kovacevic 的提示,尤其是 superuser.com 鏈接,很有幫助; 至少從 OS X 10.9.2 開始,創建 run-at-login 腳本的選項是:
注意:這些方法是關於它們是否為:
腳本本身將不可見地運行,但是 - 除了com.apple.loginwindow
登錄掛鈎方法 - 您可以從它們可見地打開應用程序; 注意事項:
不能保證任何此類應用程序將位於最前面,因此它可能會被登錄期間打開的其他窗口遮擋。
如果您想明顯地運行另一個shell 腳本,只需使用open /path/to/your-script
,它將在Terminal.app
打開它; 但是,當您的腳本終止時,終端窗口將自動關閉。
Automator [用戶特定] :
File > New
,輸入Application
Run Shell Script
操作,它會添加一個嵌入式bash
腳本,然后將您的腳本代碼粘貼到那里,或者添加一個從那里調用現有腳本的命令。 保存*.app
包並將其添加到System Preferences > User & Groups > Login Items
的Login Items
列表。
筆記:
"C"
語言環境運行。$PATH
固定為/usr/bin:/bin:/usr/sbin:/sbin
,其中不包括/usr/local/bin
com.apple.loginwindow
登錄掛鈎 [所有用戶- 已棄用,但仍然有效] :
如果您有管理員權限,這是最簡單的方法,但出於多種原因(安全性、僅限於單個、共享腳本、同步執行),它已被棄用; Apple 特別警告不要將此機制用作軟件產品的一部分。
Test.sh
)放在共享位置 - 例如/Users/Shared
- 並確保它是可執行的( chmod +x /Users/Shared/Test.sh
)。 從Terminal.app
運行以下命令:
sudo defaults write com.apple.loginwindow LoginHook /Users/Shared/Test.sh
筆記:
該腳本將以root用戶身份運行,因此請謹慎操作。
在此處列出的方法中,這是以root身份運行腳本的唯一方法。
只有一個系統范圍的登錄掛鈎。
LogoutHook
,它提供注銷時運行功能 - 與其他方法不同。login-hook 腳本在其他登錄操作之前同步運行,因此應該保持簡短。
osascript
和 AppleScript 片段創建簡單的交互(例如, osascript -e 'display dialog "Proceed?"'
); 但是,任何交互都會阻止登錄過程。該腳本在root用戶的上下文中運行,並且登錄用戶的用戶名作為第一個參數傳遞給腳本。
"C"
語言環境運行。$PATH
固定為/usr/bin:/bin:/usr/sbin:/sbin
,其中不包括/usr/local/bin
/
。啟動代理:
可以為特定用戶或所有用戶安裝launchd
-agent-executed 腳本 - 后者需要管理權限。
雖然使用launchd
是 Apple 的首選方法,但它也是最麻煩的,因為它需要創建一個單獨的*.plist
配置文件。
從好的方面來說,您可以獨立安裝多個腳本。
launchd
腳本的特定時間或順序; 松散地說,它們“在登錄時同時運行”; 在特定於用戶的任務和所有用戶的任務之間甚至沒有保證的時間安排。"C"
語言環境運行。$PATH
固定為/usr/bin:/bin:/usr/sbin:/sbin
,其中不包括/usr/local/bin
/
,但您可以通過.plist
文件對其進行配置 - 請參見下文。/Users/jdoe/script.sh
;值得注意的是, ~
-prefixed路徑不起作用。*.plist
配置文件中使用的所有鍵的說明,請參閱man launchd.plist
。啟動 [用戶特定] :
Lingon 3
(截至 2014 年初為 5 美元)是一個 GUI 應用程序,可促進以下過程,但僅適用於特定於用戶的腳本。Test.sh
)放在您的主文件夾中,例如/Users/jdoe
通過在Terminal.app
運行以下~/Library/LaunchAgents
,在~/Library/LaunchAgents
創建一個擴展名為.plist
的文件,例如~/Library/LaunchAgents/LoginScripts.Test.plist
:
touch ~/Library/LaunchAgents/LoginScripts.Test.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>Label</key> <!-- YOUR SELF-CHOSEN *UNIQUE* LABEL (TASK ID) HERE --> <string>LoginScripts.Test.sh</string> <key>ProgramArguments</key> <array> <!-- YOUR *FULL, LITERAL* SCRIPT PATH HERE --> <string>/Users/jdoe/Test.sh</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
<!-- ... -->
注釋表示要自定義的位置; 您可以自由選擇標簽,但它應該是唯一的 - .plist
文件名也是如此; 為簡單起見,保持標簽和文件名根相同。
從Terminal.app
運行以下命令:
launchctl load ~/Library/LaunchAgents/LoginScripts.Test.plist
請注意,作為副作用,腳本將立即執行。 從那時起,只要 CURRENT 用戶登錄,腳本就會執行。
launchctl load
並不是絕對必要的——因為根據文件的位置,它將在下次登錄時自動選取——但它有助於驗證文件是否正確加載。啟動 [所有用戶]
Test.sh
)放在共享位置,例如/Users/Shared
通過在Terminal.app
運行以下命令,在/Library/LaunchAgents
(需要管理員權限)中創建一個擴展名為.plist
的文件,例如/Library/LaunchAgents/LoginScripts.Test.plist
:
sudo touch /Library/LaunchAgents/LoginScripts.Test.plist
打開文件並將其保存為以下內容(確保您的文本編輯器根據需要提示管理員權限;或者,使用sudo nano /Library/LaunchAgents/LoginScripts.Test.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>Label</key> <!-- YOUR SELF-CHOSEN *UNIQUE* LABEL (TASK ID) HERE --> <string>LoginScripts.Test.sh</string> <key>ProgramArguments</key> <array> <!-- YOUR *FULL, LITERAL* SCRIPT PATH HERE --> <string>/Users/Shared/Test.sh</string> </array> <key>RunAtLoad</key> <true/> </dict> </plist>
<!-- ... -->
注釋表示要自定義的位置; 您可以自由選擇標簽,但它應該是唯一的 - .plist
文件名也是如此; 為簡單起見,保持標簽和文件名根相同。
從Terminal.app
運行以下命令:
sudo chown root /Library/LaunchAgents/LoginScripts.Test.plist sudo launchctl load /Library/LaunchAgents/LoginScripts.Test.plist
請注意,作為副作用,腳本將立即執行。 從那時起,該腳本將在任何用戶登錄時執行。
launchctl load
並不是絕對必要的——因為根據文件的位置,它將在下次登錄時自動選取——但它有助於驗證文件是否正確加載。您不能只在該文件夾中放置純腳本。 您需要一個 Apple 如何稱呼它的“專用包” ,基本上是一個包含您的可執行文件的文件夾,以及一個.plist配置。 您應該將它放在/Library/StartupItems 中,因為/System/Library/StartupItems/是為操作系統保留的。 在這里閱讀所有相關信息:
另請注意,整個內容都被標記為已棄用的技術。 並且 Apple 建議使用launchd 。 這里有一個如何設置的示例:
https://superuser.com/questions/229773/run-command-on-startup-login-mac-os-x
launchd-oneshot用於將腳本安裝為啟動作業以在登錄時運行,使用
brew install cybertk/formulae/launchd-oneshot
sudo launchd-oneshot Test.sh --on-login
披露:我是這個包的作者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.