重新引导后,node.js执行冻结

时间:2019-06-15 06:54:19

标签: node.js npm raspberry-pi3

配置:

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

我启动了MVP并开始运行。我在网络浏览器上获得了640x480 @ 20FPS的视频流,延迟为240mS,而控件上的延迟为7mS。

我正在树莓派3B +上运行NODE.JS Web服务器。操作系统是Raspbian Stretch。我正在使用Socket.IO提供低延迟的双向控件和Websocket来传输流数据包。

问题:

关闭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

2)有时我可以通过初始化npm将NODE恢复到工作状态,但有时此命令也会卡住。

pi@MazeRunner:~ $ npm --init yes

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

4)我尝试查找node.js或npm日志,但找不到运气

5)在关闭电源之前执行关机似乎会使node.js在启动时更容易冻结。

pi@MazeRunner:~ $ sudo shutdown now

问题:

1)是否可以让node.js在某个地方发出详细的调试日志来调试问题? STDOUT或STDERR中都没有错误消息

2)我希望该机器人可以即插即用,并在突然切断电源后使其始终如一地工作。我可以在浏览器页面上添加关闭按钮,但是您很容易忘记使用它。通过控制台进行关机完全消除了拥有浏览器控制界面的麻烦。

是否有办法使树莓派安全突然关闭?

感谢您能提供的任何帮助!

2 个答案:

答案 0 :(得分:1)

您的代码可能会阻塞事件循环。特别是在处理websocket时,这是一种危险的原因,循环可能会等到它被“触发”并继续前进。在这种情况下,将无法处理日志或其他任何内容。 Node.js在单个线程上运行,如果您的代码阻止了事件循环,则整个应用程序将冻结。

您也可以检出此模块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

答案 1 :(得分:0)

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

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

我打过电话

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

reboot 之后问题得到解决。