当进程崩溃时,Nodemon会丢失控制台输出

Nodemon is losing console output when the process is crashing

本文关键字:失控 控制台 输出 Nodemon 进程 崩溃      更新时间:2023-09-26

我不确定这是否纯粹是Windows问题。我没办法在其他地方测试。给出这个非常简单的代码(Coffeescript):

console.log('Calling console.log')
console.error('Calling console.error')
console.log('Calling console.log second time - fails')
console.error('Calling console.error second time - fails')
nonexisting.throwError()

直接与coffee app.coffee运行它工作得很好,我得到这个:

Calling console.log
Calling console.error
Calling console.log second time - fails
Calling console.error second time - fails
ReferenceError: nonexisting is not defined
....

然而,运行nodemon app.coffee给我的只是这个:

17 Mar 20:38:56 - [nodemon] starting `coffee.cmd server.coffee`
Calling console.log
Calling console.error
17 Mar 20:38:56 - [nodemon] app crashed - waiting for file changes before starting...

不仅没有异常信息,而且由于某种原因,后来的日志消息也被吞掉了。在更复杂的情况下,我没有办法真正找到崩溃的原因。我试着调试,但一切似乎都很好,console.log/error被调用,但由于某种原因它只是没有显示。异常被Coffeescript捕获并直接发送给stderr。

我想在控制台的开发过程中使用调试实用程序来获得很好的详细输出,并使其更容易发现问题。但这个麻烦制造者是不可能的。一旦发生未捕获的异常,我必须停止nodemon并手动运行整个程序来查找错误。(

)解决方案的所有优雅都消失了。

有谁知道是什么原因造成的,如果有一些可能的解决方案吗?

Windows 7 64bit节点0.10.26Nodemon 1.0.15Coffeescript 1.7.1上

消息被抑制,因为进程是使用:

child_process.spawn('coffee.cmd', ['server.coffee'], { stdio: ['pipe', 'pipe', 'pipe']);

特别是stderr上的pipe是问题,因为当子退出时,管道已满(或似乎来自第一个console.error),因此下一个消息不会在子死亡时放入管道中。

我已经更新了nodemon,使其在使用pipe时更聪明,因为在大多数情况下,在stdio上使用process.stdout工作得很好,并且还意味着这个原始示例脚本如您所期望的那样回显错误。

您提交的问题也已在nodemon@1.0.17

中结束。

我应该补充一下,这个SO问题的标题是误导性的(它读起来好像nodemon隐藏了所有控制台输出)-它没有隐藏控制台输出-当进程崩溃时它正在丢失控制台输出。不过,它是固定的——耶!

我有一个暗示,但无法证明我的感觉。

使用coffee执行程序时,日志消息阻塞。在第5行发生错误时,已经向控制台发出了4个跟踪。

无论使用哪种监控工具,其原理几乎是相同的:生成一个子进程来托管应用程序并监控其生命周期。这意味着您的控制台输出从子进程重定向到显示它的主机进程。

我敢打赌,故障的处理优先于日志消息,因此,主机进程在有时间显示剩余的日志之前切断了通道。