Node.js 重启后执行冻结

Node.js execution freezes after reboot

配置:

我正在构建一个 FPV 机器人,它可以通过 Wi-Fi 本地网络浏览器进行控制。

我获得了 MVP 并且 运行。我在网络浏览器上获得了 640x480@20FPS 和 240mS 延迟视频流,并且在控件上获得了 7mS 延迟。

我是 运行 NODE.JS 网络服务器 raspberry pi 3B+。操作系统是 Raspbian Stretch。我正在使用 Socket.IO 来提供低延迟双向控制和 Websockets 来传输流数据包。

问题:

关闭 Raspberry 后,NODE.JS 有时会在执行时冻结。我没有收到任何错误,也没有关于 NODE 卡住原因的反馈。它需要 CTRL-C 才能关闭。

pi@MazeRunner:~ $ node 2019-06-09-ffmpeg/node.js


如果我将 NODE.JS 作为单独的进程发布,我可以继续使用 RPI,但 NODE 在后台冻结。

pi@MazeRunner:~ $ node 2019-06-09-ffmpeg/node.js &  
[1] 778
pi@MazeRunner:~ $

详情:

  1. 有时,NODE.JS 可以在没有任何反馈的情况下等待约 5 分钟后自行恢复。才刚刚开始。
pi@MazeRunner:~ $ node 2019-06-09-ffmpeg/node.js
INFO: Server interface - enxb827eb23ca00 192.168.0.202
INFO: 192.168.0.202 listening to html requests on port 8080
INFO: /home/pi/2019-06-09-ffmpeg/index.html has been loaded into memory
INFO: /home/pi/2019-06-09-ffmpeg/style.css has been loaded into memory
INFO: /home/pi/2019-06-09-ffmpeg/jsmpeg.min.js has been loaded into memory
  1. 有时我可以通过初始化 npm 将 NODE 恢复到工作状态,但有时这个命令也会卡住。
pi@MazeRunner:~ $ npm --init yes

  1. 我总是能够通过使用 apt-get remove 删除它并使用 apt-get install 重新安装它来恢复节点,这显然是不可行的

  2. 我尝试寻找 node.js 或 npm 日志,但我没有找到它们

  3. 在切断电源之前执行关机似乎使 node.js 更有可能在启动时不冻结。

pi@MazeRunner:~ $ sudo shutdown now

问题:

  1. 有没有办法让 node.js 在某处发出详细的调试日志来调试问题? STDOUT 和 STDERR

    中都没有错误消息
  2. 我希望机器人是即插即用的,并且在突然断电后仍能持续工作。我可以在浏览器页面上添加一个关机按钮,但你很容易忘记使用它。通过控制台关闭完全违背了拥有浏览器控制界面的目的。

有没有办法让 raspbian 拉伸安全地突然关闭?

感谢您提供的一切帮助!

您的代码可能会阻止 event-loop。特别是在处理 websockets 时,它有点危险,因为 loop-cycle 可能会等到 "ticked" 后再继续。在那种情况下,没有办法处理日志或任何东西。 Node.js 在单线程上运行,如果您的代码阻塞 event-loop 您的整个应用程序将冻结。

您也可以查看此模块https://github.com/naugtur/blocked-at

参考资料
https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/
https://www.youtube.com/watch?v=8aGhZQkoFbQ
https://medium.com/the-node-js-collection/what-you-should-know-to-really-understand-the-node-js-event-loop-and-its-metrics-c4907b19da4c

我在“Pi Zero”(ARMv6) 和节点 v10 上遇到了同样的问题,当我 strace node 时,我可以看到 node 挂在 getrandom( 中。

好像重启后树莓上的熵不够

我打电话

$ sudo apt install rng-tools
$ sudo systemctl enable rng-tools

reboot 之后问题得到解决。