使用Cocoa计划任务?

时间:2010-11-26 18:07:14

标签: cocoa macos scheduled-tasks crontab launchd

Cocoa(和Mac OS X)安排程序运行的最佳方法是什么:

  • 当用户登录时。
  • 在一天中的某些时间(例如:中午12点)。
  • 以特定时间间隔(例如:每两个小时)。

除了调度之外,如果用户删除应用程序,也应该很容易取消安排程序并且不会导致错误。

本质上,该程序是一个卫星命令行可执行文件,位于同一.app捆绑包中的主应用程序文件旁边。该程序的目的是在用户的主目录中(~/Library/Application Support/MyApp内)进行一些后台数据更新。)

crontab是否适合这个? man的{​​{1}}页面表示该功能已被crontab吸收,但我似乎无法找到如何安排特定时间来运行该实用程序。

感谢。

3 个答案:

答案 0 :(得分:5)

launchd是执行此操作的正确方法(在Mac上弃用crontab,而不是launchd)。您将创建一个plist文件,其中包含有关您的程序的信息(可执行文件名,参数等),其中一部分将是(警告在浏览器中输入并且未经测试):

<key>StartCalendarInterval</key>
<dictionary>
  <key>Hour</key>
  <integer>12</integer>
</dictionary>

<key>StartInterval</key>
<integer>7200</integer>

<key>LimitLoadToSessionType</key>
<string>Aqua</string>
<key>RunAtLoad</key>
<true/>
  • StartCalendarInterval应该在第12个小时(中午)的顶部运行您的程序。
  • StartInterval应该每2小时(= 7200秒)运行一次程序
  • LimitLoadToSessionType仅在Aqua会话开始时加载您的程序(用户实际登录到窗口服务器(如果用户ssh进入,这将阻止加载)
  • RunAtLoad告诉可执行文件在加载plist时运行。这与LimitLoadToSessionType结合使用,应该在用户登录时启动可执行文件。

StartIntervalStartCalendarInterval可能是互斥的。如果是这种情况,您可以取出StartInterval密钥并将StartCalendarInterval内容更改为:

<key>StartCalendarInterval</key>
<array>
  <dictionary>
    <key>Hour</key>
    <integer>0</integer>
  </dictionary>
  <dictionary>
    <key>Hour</key>
    <integer>2</integer>
  </dictionary>
  <dictionary>
    <key>Hour</key>
    <integer>4</integer>
  </dictionary>
  <dictionary>
    <key>Hour</key>
    <integer>6</integer>
  </dictionary>
  ...
  <dictionary>
    <key>Hour</key>
    <integer>12</integer>
  </dictionary>
  ...
  <dictionary>
    <key>Hour</key>
    <integer>22</integer>
  </dictionary>
</array>

有关详细信息,请参阅man launchd.plist

答案 1 :(得分:2)

有一个很棒的GUI应用程序叫做Lingon,可以帮助编辑launchd配置文件。 你可以在这里下载&gt; Lingon

答案 2 :(得分:0)

在Mac OS X上,您可以在终端中运行“crontab -e”以启动crontab编辑器(默认情况下为Vi)。退出编辑器时,作业已安排。