【问题标题】:OS X launchd.plistOS X 启动d.plist
【发布时间】:2014-07-30 15:00:06
【问题描述】:

这是我的 plist 文件

<?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>com.homebrew.autoupdate</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/brew_up</string>
  </array>
  <key>StartInterval</key>
  <integer>86400</integer>
  <key>StandardErrorPath</key>
  <string>/usr/local/var/log/brew.log</string>
  <key>StandardOutPath</key>
  <string>/usr/local/var/log/brew.log</string>
</dict>
</plist>

/usr/local/bin/brew_up 只是一个调用brew updatebrew upgrade 等的脚本

#!/bin/sh
echo `date`: Start updating brew
/usr/local/bin/brew update && /usr/local/bin/brew upgrade && /usr/local/bin/brew cleanup
echo `date`: Finish updating brew

然后我通过launchctl load ~/Library/LaunchAgents/homebrew.autoupdate.plist加载了那个文件

然后我尝试了launchctl start com.homebrew.autoupdate,它也很好用。

但问题是,它不会像我预期的那样每 24 小时启动一次。实际上现在已经过去了48小时,甚至一次都没有开始。我在这里错过了什么?

然后我把StartInterval改成了StartCalendarInterval

  <key>StartCalendarInterval</key>
  <dict>
    <key>Hour</key>
    <integer>21</integer>
  </dict>

然后无限期启动,日志文件如下:

Thu Aug 7 21:17:20 CST 2014: Finish updating brew
Thu Aug 7 21:17:20 CST 2014: Start updating brew
Already up-to-date.
Thu Aug 7 21:18:14 CST 2014: Finish updating brew
Thu Aug 7 21:18:14 CST 2014: Start updating brew
Already up-to-date.
Thu Aug 7 21:19:39 CST 2014: Finish updating brew
Thu Aug 7 21:19:39 CST 2014: Start updating brew
Already up-to-date.
Thu Aug 7 21:22:28 CST 2014: Finish updating brew
Thu Aug 7 21:22:28 CST 2014: Start updating brew
Already up-to-date.
Thu Aug 7 21:24:46 CST 2014: Finish updating brew

更新:我认为这意味着 * 21 * * * 就像在 crontab 中一样,所以如果是的话

      <key>StartCalendarInterval</key>
      <dict>
        <key>Hour</key>
        <integer>21</integer>
        <key>Minute</key>
        <integer>0</integer>
      </dict>

它应该可以工作。

但是,StartInterval 有什么问题?

顺便说一句,我只是尝试编写一个简单的演示来测试StartInterval,它完全有效!

<?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>com.test.touch</string>
  <key>ProgramArguments</key>
  <array>
    <string>touch</string>
    <string>/tmp/touched.txt</string>
  </array>
  <key>StartInterval</key>
  <integer>60</integer>
</dict>
</plist>

【问题讨论】:

标签: macos plist launchd


【解决方案1】:

对于Scheduled Timed Jobs,您应该使用密钥StartCalendarInterval (Reference)

<key>StartCalendarInterval</key>
<dict>
    <key>Hour</key>
    <integer>11</integer>
</dict>

【讨论】:

  • 我希望它每 24 小时运行一次,所以我认为StartInterval 更合适。来自man launchd.plistStartInterval &lt;integer&gt; This optional key causes the job to be started every N seconds. If the system is asleep, the job will be started the next time the computer wakes up. If multiple intervals transpire before the computer is woken, those events will be coalesced into one event upon wake from sleep.
  • @DeanWinchester 我已经用一天一次所需的值更新了我的答案。这里也有讨论OnDemand的使用:discussions.apple.com/message/13091303#13091303
  • 我认为这意味着每个月 1 日开始工作,就像 crontab 的工作方式一样。你确定吗?
  • @DeanWinchester 是的,它类似于crontab,缺少的键被通配符。我还没有真正尝试过;所以我尝试了 Hour = 11,因为我认为您在本月 1 日是对的。
  • 是的,我想这会奏效。但我仍在试图弄清楚我的不会
【解决方案2】:

launchd 开发人员文档中的某处隐藏了一条注释,警告说按需服务需要保留一段时间。 (类似于 10 秒 IIRC。)否则,launched 会认为它们无法正常启动并尝试重新启动它们。

尝试将sleep 30 添加到您的shell 脚本中,看看是否能解决它不断重启的问题。

【讨论】:

  • 我想我知道出了什么问题。 Hour21 表示 * 21 * * * 和 crontab 一样,实际上应该是 0 21 * * *,否则会一直运行到 22:00。但仍然无法弄清楚 StartInterval 出了什么问题
猜你喜欢
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 2016-10-23
  • 2017-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-02
相关资源
最近更新 更多