所以我在我的Raspberry Pi设备上运行OSMC,它本质上是Debian + Kodi。我有一个运行的Node.js应用程序告诉Kodi(通过其JSON-RPC API)在午夜播放一些视频。调度是非常基本的:计算下一个午夜的时间,减去当前时间,你有延迟传递到setTimeout
。
容易对吗?除了它不起作用。当我第二天早上进入办公室时,没有播放任何视频,根据日志记录,setTimeout
的回叫从未被调用过。
我做了明显的事情并将Pi的系统时钟设置为23:58 PM,开始我的程序,等待了两分钟,果然:视频开始播放没有问题。如果间隔不是1天,它也可以正常工作,但例如10分钟。
然后我写了最简单的Node.js程序,以增加的时间间隔(1s,1m,5m,1h,8h和24h)安排一些日志;它还会每小时打印当前时间:
function log(format) {
var args = Array.prototype.slice.call(arguments, 1);
console.log.apply(null, ['%s: ' + format, new Date()].concat(args));
}
function schedule(delay) {
setTimeout(function () {
log('callback called after %d ms', delay);
}, delay);
log('scheduled setTimeout(%d)', delay);
}
schedule(1000);
schedule(60 * 1000);
schedule(5 * 60 * 1000);
schedule(60 * 60 * 1000);
schedule(8 * 60 * 60 * 1000);
schedule(24 * 60 * 60 * 1000);
function logTime() {
log('current time is %s', new Date());
}
logTime();
setInterval(logTime, 60 * 60 * 1000);
这是我在screen
中运行它时的输出:
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(1000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(60000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(300000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(3600000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(28800000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): scheduled setTimeout(86400000)
Mon Apr 25 2016 14:11:54 GMT+0200 (CEST): current time is Mon Apr 25 2016 14:11:54 GMT+0200 (CEST)
Mon Apr 25 2016 14:11:55 GMT+0200 (CEST): callback called after 1000 ms
Mon Apr 25 2016 14:12:55 GMT+0200 (CEST): callback called after 60000 ms
Mon Apr 25 2016 14:16:55 GMT+0200 (CEST): callback called after 300000 ms
Mon Apr 25 2016 15:21:31 GMT+0200 (CEST): callback called after 3600000 ms
Mon Apr 25 2016 15:21:31 GMT+0200 (CEST): current time is Mon Apr 25 2016 15:21:31 GMT+0200 (CEST)
Mon Apr 25 2016 16:21:31 GMT+0200 (CEST): current time is Mon Apr 25 2016 16:21:31 GMT+0200 (CEST)
Tue Apr 26 2016 08:01:23 GMT+0200 (CEST): current time is Tue Apr 26 2016 08:01:23 GMT+0200 (CEST)
Tue Apr 26 2016 08:01:23 GMT+0200 (CEST): callback called after 28800000 ms
所以短暂的间隔按预期工作,但是1小时回调和8小时回调都没有启动,直到我实际去检查输出。此外,大多数小时日志都丢失了。
有人可以解释这里发生了什么吗?
我正在运行Node.js v5.10.1,但v4.4.3显示了相同的行为。