当我没有打开终端时,为什么我的node.js应用程序偶尔会挂起?

Eri*_*ric 5 node.js tmux

我有一个我通过SSH运行的nodejs应用程序:

$ tmux
$ node server.js
Run Code Online (Sandbox Code Playgroud)

这将在tmux会话中启动我的节点应用程序.

显然,我没有一直打开SSH会话.

我发现的是偶尔我的应用程序可以处于不会为任何页面提供服务的状态.这可能与应用程序本身有关,或者可能只是一个连接不良的SSH会话.

无论哪种方式,只需登录SSH,运行:

$ tmux attach
Run Code Online (Sandbox Code Playgroud)

将焦点放在窗格上会使所有内容再次响应.


我认为node.js的重点在于一切都是非阻塞的 - 那么这里发生了什么?

Chr*_*sen 3

当窗格处于复制模式时,tmux不会从其 tty 读取。如果在 tty 中运行 \xe2\x80\x9cin\xe2\x80\x9d 的某些程序继续生成输出,则 OS\xe2\x80\x99s tty 缓冲区最终将填满并导致写入进程/线程阻塞。我不知道 Node.js 的内部结构,但它可能不会期望对 stdout/stderr 的写入被阻止:这些console函数似乎没有回调,因此它们实际上可能是阻塞的。

\n\n

因此,如果在您的 SSH 连接断开时运行 Node.js 的窗格仍处于复制模式,则 Node.js 很可能最终会被阻止。

\n\n

如果您需要确保非阻塞日志记录,那么您可能需要将 stdout 和 stderr 重定向(或 tee)到一个文件,并使用类似less查看先前日志的内容(避免tmux \xe2\x80\x99s 复制模式,因为它可能导致阻塞)。

\n\n

也许是这样的:

\n\n\n\n
# Redirect stdout/stderr to a file, running Node.js in the background.\n# Start a "less +F" on the log so that we immediately have a "tail" running.\nnode app.js >>app.log 2>&1 & less +F app.log\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者

\n\n
# This pane will act as a \'tail -f\', but do not use copy-mode here.\n# Instead, run e.g. \'less app.log\' in another pane to review prior logs.\nnode app.js 2>&1 | tee -a app.log\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者,如果您正在使用日志记录库,它可能具有可用于自动写入文件的功能。

\n