使用Cocoa计划任务?

adi*_*dib 4 macos cocoa crontab scheduled-tasks launchd

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

  • 当用户登录时
  • 在一天中的某些时间(例如:中午12:00).
  • 在某些时间间隔(例如:每两个小时).

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

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

这是crontab一个很好的候选人吗?该man页面crontab表示该功能已被吸收launchctl,但我似乎无法找到如何安排特定时间来运行该实用程序.

谢谢.

Dav*_*ong 5

launchd是这样做的正确方法(crontab在Mac上不赞成使用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/>
Run Code Online (Sandbox Code Playgroud)
  • StartCalendarInterval应在12小时(中午如此)顶部运行程序.
  • StartInterval应运行您的程序,每2小时(=7200秒)
  • LimitLoadToSessionType一个水上会议开始时,你的程序(用户实际登录到窗口服务器只加载(所以这将阻止加载如果用户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>
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅man launchd.plist.