Yosemiteの起動時にシェルスクリプトを実行する方法


21

System / Libraryにあると思われるスタートアップアイテムのディレクトリがあります:StartupItems

ローカルネットワークアドレスとサブネットマスクを使用して、起動時にイーサネットインターフェイスを構成するシェルスクリプトが必要です。イーサネットインターフェイスを構成するためのネットワーク設定では、手動設定を使用して設定しないため、これを行う必要があります。これは深刻なバグのようです、または私のインストールが悪いです。

コマンドラインからnetworksetupを使用するようアドバイスされましたが、再起動時に構成が存在するような方法でイーサネットインターフェイスを構成することはできません。

スクリプトは、root権限またはsudoを使用して作業を行う必要がありますが、sudoを使用する場合は、ブートプロセスがそのスクリプトに到達したときにブート時にパスワードダイアログが表示されると想定しています。

(FreeBsdとLinuxで十分な経験があり、ターミナルで自分のやり方を見つけることができましたが、必ずしもMac OSXに当てはまるわけではありません)

回答:


18

その1つの方法は、スクリプトにlaunchdサービスを割り当てることです。

通常どおりシェルスクリプトを作成します。その後、launchdサービスを作成して、起動時に実行できます。それらはにあり/Library/LaunchDaemonsます。これらはXMLプロパティリスト形式です。別のものを作成し、次のようなものを追加します。

<?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>
        <string>com.example.app</string>
        <key>ProgramArguments</key>
        <array>
            <string>/bin/sh</string>
            <string>/path/to/script</string>
        </array>
        <key>RunAtLoad</key>
        <true/>
        <key>KeepAlive</key>
        <false/>
    </dict>
</plist>

変更com.example.app/bin/shおよび/path/to/script必要に応じて。

その後、システムの起動中にスクリプトが実行されます。実行が早すぎる場合は、スクリプトを記述して、成功するまで必要な処理を実行するか、ゼロ以外のエラーコードで終了させて​​、</dict>行の前のプロパティリストに追加します。

<key>KeepAlive</key>
<dict>
     <key>SuccessfulExit</key>
     <false/>
</dict>

OS Xの起動デーモンとサービスの詳細については、私が探して提案する、ここでそれらを作る上での素敵なクイックリファレンスのために、またはここに何ができるかのlaunchdのより包括的な参考のために。


このplistドキュメントとは何ですか?また、/ path / to / script == / System / Library / StartupItems / scriptはありますか?
JeffK

1
最初の質問:plistドキュメントの名前は通常、プロパティリストのLabelキーに設定されているもの(この場合は "com.example.app")に.plist拡張子を使用します。
andonuts

1
2番目の質問:それは正しいですが、スクリプトは別の場所に移動する必要があります。
andonuts

plistの形式が正しくありません。キーが必要です:<key>Program</key><string>/bin/sh</string>を使用し、値を<key>ProgramArguments</key>持つ必要があります<string>/path/to/script</string>
ジョンブルックス

実際には、鉱山はあまりにも間違っている:<key>ProgramArguments</key>ニーズ配列にすることにする。..
ジョン・ブルックス

16

しばらく前に、私はcronを使用してそれを行いました。このようなエントリを作成できます

@reboot /path/to/my/script

詳細はこちら

最初の5つのフィールドの代わりに、8つの特殊文字列のいずれかが表示される場合があります。

       string          meaning
       ------          -------@reboot ------@reboot
       @reboot         Run once, at startup.
       @yearly         Run once a year, "0 0 1 1 *".
       @annually       (same as @yearly)
       @monthly        Run once a month, "0 0 1 * *".
       @weekly         Run once a week, "0 0 * * 0".
       @daily          Run once a day, "0 0 * * *".
       @midnight       (same as @daily)
       @hourly         Run once an hour, "0 * * * *".

1
知っておくととても便利です!
ジオセオ

7
cron最近のOS Xでこれを行う正しい方法ではありません。代わりにLaunchAgentまたはLaunchDeamonを使用してください(launchd)。詳細については、developer.apple.com Although it is still supported, cron is not a recommended solution. It has been deprecated in favor of launchd.
library / mac / documentation / MacOSX / Conceptual /…

4
cronlaunchdただし、設定する方がはるかに簡単です。このスレッドの2つの答えを比較して、意味を確認してください。起動時に実行するスクリプトを記述するスクリプトcronlaunchd必要な単一のファイルの単一行を取ります。
ダニー

@Dannid Kronは、実行の複製、キューのバッファリング、その他に敏感ではありません。この場合は実行可能ですが、常にスケルトンキーではなく、慣用的な解決策でもありません。
新しいアレクサンドリア

Crontabははるかに優れています。Unixの世界では早くて汚く、長い間確立されています。この@rebootキーワードを完全に掘り下げます。
macetw

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.