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

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

$ tmux $ node server.js 

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

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

我一直在寻找的是,偶尔我的应用程序可能会进入一个不会服务器页面的状态。 这可能与应用程序本身有关,也可能只是一个很差的SSH会话。

无论哪种方式,只需login到SSH,运行:

 $ tmux attach 

把重点放在窗格上,使所有的事情都能够再次响应


我认为node.js的全部内容都是非阻塞的 – 那么这里发生了什么?

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

所以,如果你的SSH连接被删除,Node.js可能最终被阻塞,如果它运行的窗格处于复制模式。

如果您需要确保非阻塞日志logging,那么您可能需要将stdout和stderrredirect到一个文件,并使用类似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 eg 'less app.log' in another pane to review prior logs. node app.js 2>&1 | tee -a app.log 

或者,如果您正在使用日志logging库,则可能有一些可用于自动写入文件的内容。