在我的最后与launchd

时间:2015-02-26 20:51:09

标签: bash terminal launchd

大家好,感谢您阅读本文。我有下面的launchd 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>
<string>com.me.sendip</string>
<key>Program</key>
<string>/Users/me/Documents/sendip.sh</string>
<key>StartInterval</key>
<integer>60</integer>
<key>StandardErrorPath</key>
<string>/Users/me/Desktop/sendiperr.log</string>
<key>StandardOutPath</key>
<string>/Users/me/Desktop/sendip.log</string>
</dict>

我也有以下脚本

/Users/me/Documents/Scripts/ip.sh | mail -s "Laptop ip" me@gmail.com

我尝试使用所有工具here进行问题排查。该脚本在启动时使用空日志文件触发,但之后没有任何内容。

有人请帮忙。我完全难过,我确信它是愚蠢的。非常感谢。

2 个答案:

答案 0 :(得分:1)

嗯。我使用10.9.5中的以下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>Disabled</key>
    <false/>
    <key>Label</key>
    <string>org.myorg.mytask</string>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/bin/php</string>
        <string>/path/to/myscript.php</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Minute</key>
        <integer>5</integer>
    </dict>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>

在每小时过去5分钟,每小时一次。

我认为你想要每分钟跑一次,对吧?所以你的版本将是:

<?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>Disabled</key>
    <false/>
    <key>Label</key>
    <string>com.me.sendip</string>
    <key>ProgramArguments</key>
    <array>
        <string>/Users/me/Documents/sendip.sh</string>
    </array>
    <key>QueueDirectories</key>
    <array/>
    <key>StartInterval</key>
    <integer>60</integer>
    <key>WatchPaths</key>
    <array/>
</dict>
</plist>

您可能需要通过在终端中运行此命令来启动该服务:(它将需要您的密码)

sudo launchctl load com.me.sendip

编辑:这是一个具有更明确日志记录的脚本:

#!/bin/bash

OUTFILE='/Library/Logs/com.whatever.sendip.log'
ERRFILE='/Library/Logs/com.whatever.sendip.err.log'

SCRIPT='/Users/me/Documents/Scripts/ip.sh'
TARGET_EMAIL='me@gmail.com'
TARGET_SUBJECT='Laptop ip'

VERBOSE=1

if [ "$VERBOSE" -ne 0 ]; then
    date >>"$OUTFILE"
    date >>"$ERRFILE"

    echo -n 'Current user: ' >>"$OUTFILE"
    whoami >>"$OUTFILE"
fi

INFO=$("$SCRIPT" 2>>"$ERRFILE")

echo "$INFO" | mail -s "$TARGET_SUBJECT" "$TARGET_EMAIL" >>"$OUTFILE" 2>>"$ERRFILE"

ERROR_CODE="$?"

if [ "$ERROR_CODE" -ne 0 ]; then
    echo "Result: Error Code $ERROR_CODE" >>"$OUTFILE"
    echo "Info: $INFO" >>"$OUTFILE"
elif [ "$VERBOSE" -ne 0 ]; then
    echo "Result: Success" >>"$OUTFILE"
    echo "Info: $INFO" >>"$OUTFILE"
fi

答案 1 :(得分:1)

事实证明,launchd放弃了我试图运行的脚本的子进程。事实证明这是一个常见的问题。 Found the answer here.