web-dev-qa-db-ja.com

Mac OS(OS X)のログイン時にシェルスクリプトを起動する

私はこのシェルスクリプト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プログラムが実行されていません。

16
user3472065

そのフォルダに単純なスクリプトを配置することはできません。 「専用バンドル」Appleが呼び出す方法、基本的に実行可能ファイルを含むフォルダ、および.plistconfiguration。そして、/ Library/StartupItemsに配置する必要があります/ System/Library/StartupItems /は、オペレーティングシステム用に予約されています。

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

また、全体がdeprecated technologyとしてマークされていることにも注意してください。そして、Appleはlaunchdの使用を示唆しています。ここに設定する方法の例があります:

https://superuser.com/questions/229773/run-command-on-startup-login-mac-os-x

7
Ivan Kovacevic

Ivan Kovacevicのポインタ 、特にsuperuser.comリンクが役立ちます。 OS X 10.9.2以降、run-at-loginスクリプトを作成するためのオプションは次のとおりです。

注:メソッドには、次のいずれであるかに関して注釈が付けられます。

  • 特定のユーザーに固有( "[user-SPECIFIC]");つまり、インストールeachユーザーに対して実行する必要があります(必要な場合)。通常、スクリプトはユーザー固有の場所に格納され、インストールにはroot(管理)権限は必要ありません。
  • すべてのユーザーに有効( "[ALL users]");つまり、インストールはすべてのユーザーに対して有効になります。スクリプトは通常共有場所に保存およびroot(管理)権限インストールに必要です。

スクリプト自体はinvisiblelyを実行しますが、com.Apple.loginwindow login-hookメソッドを除いて、スクリプトからアプリケーションを視覚的に開くことができます。注意事項:

  • そのようなアプリケーションがfrontmostになる保証はありません。そのため、ログイン中に開かれた他のウィンドウによって隠される可能性があります。

  • 別のシェルスクリプトを目に見えて実行したい場合は、open /path/to/your-scriptを使用してTerminal.appで開きます。ただし、スクリプトが終了すると、ターミナルウィンドウは自動的に閉じます。


Automator [user-SPECIFIC]

  • File > New、タイプApplication
  • 埋め込みbashスクリプトを追加するRun Shell Scriptアクションを追加し、そこにスクリプトコードを貼り付けるか、そこから既存のスクリプトを呼び出すコマンドを追加します。
  • *.appバンドルを保存して、Login ItemsSystem Preferences > User & Groups > Login Itemsリストに追加します。

    注意:

    • 埋め込みスクリプトは、デフォルトの"C"ロケールで実行されます。
    • $PATH/usr/bin:/bin:/usr/sbin:/sbinに固定されており、特に/usr/local/binは含まれていません
    • 作業ディレクトリ。現在のユーザーのホームディレクトリです。

com.Apple.loginwindowloginフック[すべてのユーザー-非推奨、ただし機能します]

管理者権限を持っている場合、これが最も簡単な方法ですが、さまざまな理由(セキュリティ、単一の共有スクリプト、同期実行に制限されている)のため、非推奨です。 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としてスクリプトを実行する唯一の方法です。

    • システム全体のログインフックは1つだけです。

      • 他のアプローチとは異なり、ログアウト実行機能を提供するログアウトフックLogoutHookもあることに注意してください。
    • ログインフックスクリプトは、他のログインアクションの前に同期して実行されるため、は短くする必要があります。

      • 特に、デスクトップが表示される前に実行されます。あなたはスクリプトからアプリケーションを起動できませんが、osascriptとAppleScriptスニペット(osascript -e 'display dialog "Proceed?"'など)を介して簡単な相互作用を作成できます。ただし、すべての対話はログインプロセスをブロックします。
    • スクリプトはrootユーザーのコンテキストで実行され、ログオンしているユーザーのユーザー名が最初の引数としてスクリプトに渡されます。

    • スクリプトは、デフォルトの"C"ロケールで実行されます。
    • $PATH/usr/bin:/bin:/usr/sbin:/sbinに固定されており、特に/usr/local/binは含まれていません
    • 作業ディレクトリ。 /です。

リリースされたエージェント

launchd- agentが実行するスクリプトは、特定のユーザー用にインストールできますORすべてのユーザー用-後者には管理者権限が必要です。

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を参照してください。
    • ユーザー固有のタスクとすべてのユーザーのタスクの両方がcurrentユーザー(ユーザーログオン)として実行されます。

launchd [user-SPECIFIC]

  • 注: Lingon 3 (2014年の初めに$ 5)は、以下のプロセスを容易にするGUIアプリケーションですが、ユーザー固有のスクリプト専用です。
  • Test.shなどのスクリプトを、/Users/jdoeなどのホームフォルダに配置します。
  • .plistで次のコマンドを実行して、~/Library/LaunchAgents~/Library/LaunchAgents/LoginScripts.Test.plistの拡張子を持つファイルを作成します(例:Terminal.app)。

    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
    
  • 副作用として、スクリプトはすぐに実行されることに注意してください。その時点から、現在のユーザーがログオンするたびにスクリプトが実行されます。

  • launchctl loadを実行する必要はありません。ファイルの場所により、次回のログイン時に自動的に取得されるためですが、ファイルが正しく読み込まれることを確認するのに役立ちます。

開始[すべてのユーザー]

  • Test.shなどのスクリプトを、/Users/Sharedなどの共有場所に配置します。
  • .plistで次のコマンドを実行して、/Library/LaunchAgents/Library/LaunchAgents/LoginScripts.Test.plistの拡張子を持つファイル(管理者権限が必要)を作成します(例:Terminal.app)。

    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を実行する必要はありません。ファイルの場所により、次回のログイン時に自動的に取得されるためですが、ファイルが正しく読み込まれることを確認するのに役立ちます。
41
mklement0

launchd-oneshot は、ログイン時に実行するlaunchdジョブとしてスクリプトをインストールするために使用されます。

brew install cybertk/formulae/launchd-oneshot
Sudo launchd-oneshot Test.sh --on-login
2
Quanlong