Node.js 无法从特定应用程序的spawn管道标准输出

Node.js 无法从特定应用程序的spawn管道标准输出,node.js,process,spawn,Node.js,Process,Spawn,我有两个脚本A.js和B.js,还有一个第三方应用程序(开源)。脚本A.js使用execSync启动第三方应用程序。脚本B.js使用spawn启动脚本A.js 如果我自己运行脚本A.js,我可以看到第三方应用程序的整个输出。当我通过运行脚本B.js间接运行它时,我只能看到一些输出 A.js B.js 当我启动B时,我只看到“Hello”,但是二进制文件正在运行(它是一个服务器,我可以打开到它的TCP连接)。我只是没有看到结果。当我单独启动时,我会看到“Hello”和常规二进制文件的输出 如果我将

我有两个脚本A.js和B.js,还有一个第三方应用程序(开源)。脚本A.js使用
execSync
启动第三方应用程序。脚本B.js使用
spawn
启动脚本A.js

如果我自己运行脚本A.js,我可以看到第三方应用程序的整个输出。当我通过运行脚本B.js间接运行它时,我只能看到一些输出

A.js

B.js

当我启动B时,我只看到“Hello”,但是二进制文件正在运行(它是一个服务器,我可以打开到它的TCP连接)。我只是没有看到结果。当我单独启动时,我会看到“Hello”和常规二进制文件的输出

如果我将B的stdout更改为“inherit”,它会工作

为什么会发生这种情况,我该如何解决

更新:似乎与使用两个脚本无关。不使用stdioinherit直接生成二进制文件也会出现同样的问题。似乎取决于第三方应用程序如果程序只是打印到标准输出,它会如何影响节点?

上下文:我想启动服务器,然后在服务器准备就绪时运行命令。准备好后,服务器打印出一条特定的消息。想法是等待这条消息被打印出来。打印出此消息后,它不会打印出任何其他内容,但会保持运行状态

我试图通过管道传输的特定可执行文件是

更新:在这一点上,我假设这是我试图通过管道传输的特定二进制文件。我想了解二进制文件如何影响这种行为,即使用继承而不是管道如果有人可以使用节点脚本(或c程序)重新创建此行为,这将回答问题。


环境

  • 操作系统:Windows 10
  • 控制台:Cygwin(还尝试了常规命令提示符)
  • 节点v7.10.0

请注意,这与此处的问题相同:

有一个简单而安全的解决方法,就是将应用程序的输出通过管道传输到文件,然后从同一文件读取,这样您就不必担心事件是在尝试侦听之前还是之后触发的

要归档的管道:

var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./err.log', 'a');

var child = spawn('applicaiton', [], {
    detached: true,
    stdio: [ 'ignore', out, err ]
});
希望有帮助,告诉我进展如何


祝你好运,

chatscript正在执行的写入操作是“fprintf(stdout,…”,这是一个缓冲输出,保存到like(4k?)被缓冲然后刷新。例如,在ChatScript/src/os.cpp第1849行的fprintf(stdout)之后添加'fflush(stdout)'。。。然后输出工作(在某种程度上,需要进行进一步的更改,但我现在至少在cs_init.txt中记录了错误)

另一个测试是将chatscript.exe重定向到一个文件,并查看该文件得到了什么。“chatscript>zz”,然后用ctrl-c结束chatscript,您将看到zz也是空的……这表明IO已被缓冲,并且未被适当刷新以输出

M:\javascript\test_exec>node b.js
Hello

   in cs_init.txt at 0:
     A subdirectory or file USERS already exists.
Error opening utf8writeappend file LOGS/startlog.txt: No such file or     directory
ChatScript Release Version 7.5 pid: 0 32 bit Windows compiled Jun 24 2017 09:42:13 host=local
Params:   dict:2097151 fact:800000 text:100000kb hash:215127
          buffer:80x80kb cache:1x5000kb userfacts:100 outputlimit:80000     loglimit:80000
Unable to read dictionarySystem.h
Missing 37 word files
read 0 raw words

   in facts.txt at 0:
    A subdirectory or file USERS already exists.

不起作用。当“分离”为true时(使用
shell:true
shell:false
进行测试),不会将任何输出写入文件。当“分离”为false时,只会写入部分输出,就像我在原问题中插入管道一样。作为旁注,当“分离”为true时(而“分离”为true)并且没有输出到文件,我可以在屏幕上显示的新分离外壳中看到正确的输出。但是我无法捕获该输出。我有一种感觉,这就是问题所在。您知道为什么直接(在节点外部)运行chatscript会“正确”打印stdout吗?ttys是否设置某种标志以禁用(或更低)缓冲?您将看到它在一个简单的windows命令中在节点外部打印正常。
var fs = require('fs');
var spawn = require('child_process').spawn;
var out = fs.openSync('./out.log', 'a');
var err = fs.openSync('./err.log', 'a');

var child = spawn('applicaiton', [], {
    detached: true,
    stdio: [ 'ignore', out, err ]
});
M:\javascript\test_exec>node b.js
Hello

   in cs_init.txt at 0:
     A subdirectory or file USERS already exists.
Error opening utf8writeappend file LOGS/startlog.txt: No such file or     directory
ChatScript Release Version 7.5 pid: 0 32 bit Windows compiled Jun 24 2017 09:42:13 host=local
Params:   dict:2097151 fact:800000 text:100000kb hash:215127
          buffer:80x80kb cache:1x5000kb userfacts:100 outputlimit:80000     loglimit:80000
Unable to read dictionarySystem.h
Missing 37 word files
read 0 raw words

   in facts.txt at 0:
    A subdirectory or file USERS already exists.