这个问题的部分答案在这里:https://stackoverflow.com/q/132955/6260775
我正在寻找一种解决方案,以解决事件以固定时间间隔运行的特定情况,例如 10:00、10:30、11:00、11:30 等,并且希望避免在 CalendarEvents 中安排每个单独的事件。当我们想要每 10 分钟运行一次时,可能会变得非常混乱。
当使用 StartInterval 的值(例如 1800)时,事件将随时间变化,具体取决于任务完成所需的时间。因此,在某些时候,我们将无法确定任务何时准确运行。
答案1
StartCalendarInterval
允许定义类似于的运行计划cron
。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.example.exampled</string>
<key>Program</key>
<string>/path/tp/exampled</string>
<key>ProgramArguments</key>
<array>
<string>exampled</string>
<string>argv1</string>
<string>argv2</string>
</array>
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Minute</key>
<integer>0</integer>
</dict>
<dict>
<key>Minute</key>
<integer>30</integer>
</dict>
</array>
</dict>
</plist>
每当当前时间的分钟部分为0
或时,上述任务就会运行30
。
引用手册页(man launchd.plist
):
StartCalendarInterval <整数字典或整数字典数组>
此可选键使作业按指定的日历间隔启动。缺少的参数被视为通配符。语义类似于crontab(5)指定触发日期的方式。可以在数组中指定多个字典,以安排多个日历间隔。
与 cron 在计算机睡眠时跳过作业调用不同,launchd 将在计算机下次唤醒时启动作业。如果在计算机唤醒之前发生多个间隔,则这些事件将在计算机从睡眠状态唤醒时合并为一个事件。
注意开始间隔和开始日历间隔彼此之间并不知道对方的存在。系统对它们进行完全独立的评估。
Minute <integer> The minute (0-59) on which this job will be run. Hour <integer> The hour (0-23) on which this job will be run. Day <integer> The day of the month (1-31) on which this job will be run. Weekday <integer> The weekday on which this job will be run (0 and 7 are Sunday). If both Day and Weekday are specificed, then the job will be started if either one matches the current date. Month <integer> The month (1-12) on which this job will be run.