我在 OS X 10.4.11 上使用 launchd 对 FileMaker 脚本进行类似 cron 的调度,这真是太棒了。(我在serverfault描述了我早期的工作经历。)起初我认为问题在于 FileMaker 脚本打开了一个 GUI,这对于 LaunchDaemon 来说似乎是禁止的。然后我把它改成了一个 LaunchAgent,它允许使用窗口资源,但仍然不行。
以下是一些没有意义的事情的清单:
如果您在手动加载任务后使用 launchctl 启动任务,那么一切正常。
sudo launchctl start my.script.name
如果您选择未来几分钟(而不是未来几个小时)的 StartInterval,然后加载 .plist,一切正常。(起初我以为这可能与屏幕保护程序有关——当 ss 执行时,某些东西会被垃圾收集或其他东西;但如果即使在 ss 启动之后也安排了它,它似乎也可以工作,只要它不是未来太远了。)
我将 FileMaker 程序的调用封装在一个 shell 脚本中,该脚本除了执行 FileMaker 程序外,还将时间戳写入日志文件。通过阅读这个日志文件,我可以验证,是的,shell 脚本确实是由 launchd 在适当的时间调用的。或者至少,几乎,因为:
日志显示了一些奇怪的东西:如果我安排在晚上 8:08 启动脚本,我会执行两次,彼此相隔几秒钟:
[Tue Jan 24 20:07:57 CST 2012] 执行脚本!
[Tue Jan 24 20:08:00 CST 2012] 执行脚本!
我已经走到了尽头——我已经阅读了相关的联机帮助页、Apple 技术文档以及 StackExchange 站点上的其他文章。我真的尽我所能完成了我的功课。任何可以帮助我的人都会有一些严重的因果报应。
再说一次,这里是 .plist,其中一些杂乱无章(XML 定义、日志信息)被编辑掉了。(请记住,这在手动加载时有效,所以我知道 plist 本身没问题。)
<plist version="1.0">
<dict>
<key>Label</key>
<string>shane.useragent.launcher</string>
<key>ProgramArguments</key>
<array>
<string>/Users/shane/launchFM.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>20</integer>
<key>Minute</key>
<integer>8</integer>
</dict>
</dict>
</plist>