Raspberry Pi / Debian上的Node.js:setTimeout行为特殊/不可靠

时间:2016-04-26 07:14:52

标签: node.js raspberry-pi raspbian raspberry-pi3

所以我在我的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显示了相同的行为。

1 个答案:

答案 0 :(得分:0)

显然这是一个已知问题:https://github.com/nodejs/node/issues/4262