簡體   English   中英

在 Mac OS (OS X) 中登錄時啟動 shell 腳本

[英]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 腳本的選項是:

注意:這些方法是關於它們是否為:

  • 特定於給定用戶(“ [ user-SPECIFIC ] ”); 即,如果需要,必須為每個用戶執行安裝; 腳本通常存儲在用戶特定的位置,安裝不需要 root(管理)權限。
  • 對所有用戶有效(“ [所有用戶] ”); 即安裝對所有用戶生效; 腳本通常存儲在共享位置,安裝需要root(管理)權限

腳本本身將不可見地運行,但是 - 除了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 ItemsLogin 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/是為操作系統保留的。 在這里閱讀所有相關信息:

https://developer.apple.com/library/mac/documentation/macosx/conceptual/bpsystemstartup/chapters/StartupItems.html

另請注意,整個內容都被標記為已棄用的技術 並且 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM