launchd 在我这边

At my end with 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。该脚本在启动时会触发一个空日志文件,但之后什么也没有。

有人请帮助。我完全被难住了,我确信这很愚蠢。非常感谢。

嗯。我 运行 在 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

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