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

时间:2013-01-13 22:46:02

标签: node.js tmux

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

$ tmux
$ node server.js

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

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

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

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

$ tmux attach

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


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

1 个答案:

答案 0 :(得分:2)

当窗格处于复制模式时, tmux 不会从其tty读取。如果在tty中运行“in”的某个程序继续生成输出,则OS的tty缓冲区最终将填充并导致写入进程/线程被阻塞。我不知道Node.js的内部,但它可能不会期望写入stdout / stderr来阻止:console functions似乎没有回调,所以它们实际上可能是阻塞的。

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

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

也许是这样的:

# Redirect stdout/stderr to a file, running Node.js in the background.
# Start a "less +F" on the log so that we immediately have a "tail" running.
node app.js >>app.log 2>&1 & less +F app.log

或者

# This pane will act as a 'tail -f', but do not use copy-mode here.
# Instead, run e.g. 'less app.log' in another pane to review prior logs.
node app.js 2>&1 | tee -a app.log

或者,如果您使用的是日志库,则可能会使用某些内容自动写入文件。