1

/Library/LaunchDaemons の plist ファイルを使用して、起動時に launchd でシェル スクリプトを実行しようとしています (問題がある場合は 10.8.x で):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>testD</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/lfriedman/cuda-stuff/sw/gpgpu/build/scripts/testing/testD.sh</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>KeepAlive</key>
        <true/>
    <key>UserName</key>
    <string>lfriedman</string>
    <key>AbandonProcessGroup</key>
    <false/>
    <key>StandardOutPath</key>
    <string>/tmp/testD.out</string>
    <key>StandardErrorPath</key>
    <string>/tmp/testD.err</string>
</dict>
</plist>

シェル スクリプト内には、「hostname -s」への呼び出しがあります。スクリプトを手動で実行すると、すべて正常に動作します。cron 経由でスクリプトを実行すると、すべて正常に動作します。ただし、起動時に launchd を介して実行すると、'hostname -s' から返される値は、システムの実際のホスト名ではなく、常に (誤って) 'localhost' として返されます。起動時以外にスクリプトを実行するように plist を微調整すると、正しい処理が行われ、システムの実際の短いホスト名が返されます。これは、OS のネットワーク サブシステムが完全に実行される前に、launchd がそのジョブを起動している場所で、ある種の競合状態が発生していると考えるように導きます。

launchd がジョブを実行する前に、OS が「完全に」起動されていることを確認する特別な方法はありますか? または、プログラムが呼び出される前に plist ファイル内で遅延を強制する方法はありますか?

4

1 に答える 1

0

残念ながら、launchd には依存関係を設定する方法がないため、スクリプトに遅延を設定する必要があります。シェル スクリプトでネットワークを確認する簡単な方法は次のとおりです。

#!/bin/bash

# Example Daemon Starter
. /etc/rc.common

CheckForNetwork

while [ "${NETWORKUP}" != "-YES-" ]
do
    sleep 5
    NETWORKUP=
    CheckForNetwork
done

# Now do what you need to do.

次のリンクで詳細を確認できます: http://blog.slaunchaman.com/2010/07/01/how-to-run-a-launchdaemon-that-requires-networking/

于 2013-05-20T16:58:29.517 に答える