我是 launchd 的新手,所以可能我做错了什么。我有一个脚本,打算每小时运行一次。为此,我创建了一个 plist 文件,其中包含以下条目,以便实现这一点:
<key>StartInterval</key>
<integer>3600</integer>
它大约每小时运行一次,但它表现得好像时间间隔是从一个实例的完成时间到下一个实例的开始时间。我这样说是因为开始时间越来越晚。以下是列表:
Aug 30 21:00:43 2016 2016083021
Aug 30 22:00:45 2016 2016083022
Aug 30 23:00:49 2016 2016083023
Aug 31 00:00:51 2016 2016083100
Aug 31 01:00:53 2016 2016083101
Aug 31 02:00:54 2016 2016083102
Aug 31 03:00:56 2016 2016083103
Aug 31 04:00:57 2016 2016083104
Aug 31 05:00:58 2016 2016083105
Aug 31 06:01:00 2016 2016083106
Aug 31 07:01:02 2016 2016083107
Aug 31 08:01:06 2016 2016083108
Aug 31 09:01:11 2016 2016083109
Aug 31 10:01:17 2016 2016083110
Aug 31 11:01:22 2016 2016083111
Aug 31 12:01:27 2016 2016083112
Aug 31 13:01:32 2016 2016083113
Aug 31 14:01:38 2016 2016083114
Aug 31 15:01:43 2016 2016083115
Aug 31 16:01:51 2016 2016083116
Aug 31 17:01:56 2016 2016083117
Aug 31 18:02:02 2016 2016083118
这是 launchd 的已知功能吗?我应该以不同的方式设置启动间隔吗?
答案1
StartInterval
大约按照指定的秒数重复。StartCalendarInterval
在指定的日历 / 时钟时间重复。
以下是我最终使用的方法:
<key>StartCalendarInterval</key>
<array>
<dict>
<key>Minute</key>
<integer>0</integer>
</dict>
</array>
仍然会有一些随机延迟,但它是在指定的时间之后而不是经过的时间之后,因此不会逐渐变得越来越晚。
Sep 1 21:00:08 2016 2016090121
Sep 1 22:00:04 2016 2016090122
Sep 1 23:00:04 2016 2016090123
Sep 2 00:00:02 2016 2016090200
Sep 2 01:00:06 2016 2016090201
Sep 2 02:00:08 2016 2016090202
Sep 2 03:00:02 2016 2016090203
Sep 2 04:00:06 2016 2016090204
Sep 2 05:00:02 2016 2016090205
Sep 2 06:00:02 2016 2016090206
Sep 2 07:00:07 2016 2016090207
Sep 2 08:00:03 2016 2016090208
Sep 2 09:00:04 2016 2016090209
Sep 2 10:00:09 2016 2016090210
Sep 2 11:00:11 2016 2016090211
Sep 2 12:00:11 2016 2016090212
Sep 2 13:00:08 2016 2016090213
Sep 2 14:00:10 2016 2016090214
Sep 2 15:00:10 2016 2016090215
Sep 2 16:00:11 2016 2016090216
Sep 2 17:00:11 2016 2016090217
Sep 2 18:00:14 2016 2016090218
Sep 2 19:00:09 2016 2016090219
Sep 2 20:00:07 2016 2016090220