使用Cocoa如何创建定时任务?

4
在Cocoa(和Mac OS X)中,最好的方式是什么来安排程序运行:
  • 当用户登录时
  • 在一天的某些时间(例如:中午12:00)
  • 在一定时间间隔内(例如:每两个小时)
除了调度之外,还应该很容易取消程序的调度,并且如果用户删除应用程序不会导致错误。
本质上,该程序是一个卫星命令行可执行文件,放置在同一 .app 包内主应用程序文件旁边。 该程序的目的是在用户的主目录下进行一些后台数据更新(在〜/ Library / Application Support / MyApp 内)。 crontab是否是这样做的好选择? crontabman页面说该功能已被吸收到launchctl中,但我似乎找不到如何安排特定时间运行实用程序的方法。
谢谢。
3个回答

6

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


这个解决方案是一个不错的选择,在大多数情况下也是最好的选择。但是当需要在沙盒模式下创建一个动态可配置的任务时,这种方法就不可行了。 - Marcelo
更改系统日期时间后,即使时间与plist时间不匹配,应用程序也会自动启动。 - Amit Khandelwal

2

有一个很好用的GUI应用程序叫做Lingon,可以帮助编辑launchd配置文件。 您可以在此处下载它 > Lingon


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接