使用launchd在启动时启动shell脚本时无法获得真正的主机名

时间:2013-04-23 16:23:21

标签: macos plist launchd

我正在尝试使用launchd运行shell脚本,通过/ Library / LaunchDaemons中的plist文件(在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>

在shell脚本中调用'hostname -s'。如果我手动运行脚本,一切正常。如果我通过cron运行脚本,一切正常。但是,当它通过launchd在引导时运行时,从'hostname -s'返回的值总是(错误地)返回为'localhost',而不是系统的实际主机名。如果我调整plist以在启动之外的时间运行脚本,它也会做正确的事情并返回系统的实际短主机名。这让我认为,在操作系统的网络子系统完全运行之前,launchd正在解决其工作的某种竞争条件。

在launchd运行作业之前,是否有一些特殊方法可以确保操作系统“完全”启动?或者在调用程序之前强制在plist文件中延迟的方法?

1 个答案:

答案 0 :(得分:0)

不幸的是,launchd没有设置依赖关系的方法,所以你需要在脚本中有延迟。在shell脚本中,检查网络的简便方法是:

#!/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/