Cocoa 的计划任务?

发布于 2024-10-04 10:11:55 字数 478 浏览 2 评论 0原文

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

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

除了调度之外,还应该能够轻松地取消调度程序,并且在用户删除应用程序时不会导致错误。

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

crontab 是否适合执行此操作? crontabman 页面说该功能已被 launchctl 吸收,但我似乎找不到如何安排特定时间运行该实用程序。

谢谢。

What is the best way in Cocoa (and Mac OS X) to schedule a program to be run:

  • when the user logs in.
  • at certain times of the day (for example: 12:00 noon).
  • at certain time intervals (for example: every two hours).

Besides scheduling, it should also be easy to un-schedule the program and not cause errors should the user delete the application.

Essentially the program is a satellite command-line executable placed next to the main application's file within the same .app bundle. The program's purpose is to do some background data updates in the user's home directory (within ~/Library/Application Support/MyApp.)

Is crontab a good candidate for this? The man page for crontab said that the functionality has been absorbed to launchctl, but I can't seem to find how to schedule specific times to run the utility.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

感性不性感 2024-10-11 10:11:55

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< 结合使用。 /code>,应该在用户登录时启动可执行文件。

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

launchd is the proper way to do this (crontab is deprecated on the Mac in favor of launchd). You'd create a plist file with the information about your program (executable name, arguments, etc), and part of it would be (warning typed in a browser and untested):

<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/>
  • The StartCalendarInterval should run your program at the top of the 12th hour (so noon).
  • The StartInterval should run your program every 2 hours (= 7200 seconds)
  • The LimitLoadToSessionType only loads your program when an Aqua session begins (the user actually logs in to the window server (so this would prevent loading if the user ssh's in)
  • The RunAtLoad tells the executable to run when the plist is loaded. This, combined with the LimitLoadToSessionType, should start the executable when the user logs in.

It's possible that StartInterval and StartCalendarInterval are mutually exclusive. If that's the case, you can take out the StartInterval key and change the StartCalendarInterval stuff to:

<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>

For more information, see man launchd.plist.

寂寞美少年 2024-10-11 10:11:55

有一个名为 Lingon 的漂亮 GUI 应用程序,它可以帮助编辑 launchd 配置文件。
您可以在这里下载> Lingon

There is a nice GUI app called Lingon which helps with editing launchd configuration files.
You can download it here > Lingon

谁把谁当真 2024-10-11 10:11:55

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

On Mac OS X you can run "crontab -e" in the Terminal to start the crontab editor (Vi by default). When you quit the editor, the job is scheduled.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文