Launchd使用手动“launchctl start”运行,但不在StartCalendarInterval上运行

时间:2016-05-07 04:48:12

标签: macos osx-mavericks launchd launch-daemon

我有一个非常简单的启动守护进程com.daily.vocab.plist,它只运行一个基本脚本。它应该在某个时间每天运行(使用StartCalendarInterval),但我不能让它发生。网上有很多帖子说它会运行一两分钟,但对我来说它永远不会运行。

我测试时将来的运行时间设置为5分钟,现在将其设置为每分钟的0秒运行,这样我就能让它运行起来。一旦它正常工作,我会将其设置为我想要的每日运行时间。

正如this tutorial中所建议的那样,它保存在/ Library / LaunchDaemons中。我用launchctl load /Library/LaunchDaemons/com.daily.vocab.plist手动加载它。事实上,当我运行launchctl list时,我确实已经加载了它。当我手动告诉它与launchctl start com.daily.vocab一起运行时,它会按预期立即运行。唯一的问题是StartCalendarInterval似乎被忽略了。我在Macbook上的小牛队。

这是文件:com.daily.vocab.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.daily.vocab</string>
    <key>Program</key>
      <string>/Users/MGS/developer/projects/vocab-sms/scripts/DEvocab.sh</string>
    <key>StartCalendarInterval</key>
      <dict>
        <key>Second</key>
            <integer>0</integer>
      </dict>
  </dict>
</plist>

理想情况下,我相信我希望它每天早上7:15运行,而StartCalendarInterval部分改为:

<key>StartCalendarInterval</key>
    <dict>
      <key>Hour</key>
        <integer>7</integer>
      <key>Minute</key>
        <integer>15</integer>
    </dict>

如果您甚至可以分享LaunchDaemon的示例,您必须使用StartCalendarInterval以及您为使其工作而执行的每个步骤(例如,运行launchctl load x.x.x.plist),这将非常有用!

解决方案:此本地守护程序实际上应该是用户代理,因此需要将其保存在〜/ Library / LaunchAgents目录中并从中加载。从那里,我还需要卸载代理并重新加载代理。

注意:在卸载/加载之前,守护进程/代理不会在launchd中自动更新。您不能只保存更新的.plist并期望它能够正常工作!

1 个答案:

答案 0 :(得分:0)

保存在/Library/...中的

启动的帖子是本地域中的守护进程/代理,必须加载sudo。如果没有sudo,您将在用户域中加载与实际路径不匹配的守护程序。

由于您无论如何都要在用户域中调用脚本,请将脚本保存在~/Library/LaunchAgents(它不是守护程序)中。 plist语法应该是正确的。