4

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

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

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

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

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

谢谢。

4

3 回答 3

6

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/>
  • 应该在第StartCalendarInterval12 小时(中午)开始运行您的程序。
  • 应该每 2 小时运行一次程序(StartInterval= 7200 秒)
  • 仅在LimitLoadToSessionTypeAqua 会话开始时加载您的程序(用户实际登录到窗口服务器(因此如果用户登录,这将阻止加载ssh
  • RunAtLoad告诉可执行文件在加载 plist 时运行。这与LimitLoadToSessionType, 应该在用户登录时启动可执行文件。

这是可能的,StartInterval并且StartCalendarInterval是相互排斥的。如果是这种情况,您可以取出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

于 2010-11-26T18:20:42.063 回答
2

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

于 2010-11-26T18:27:51.670 回答
0

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

于 2010-11-26T18:18:22.557 回答