2017-06-03 31 views
1

我有两个脚本A.js和B.js,以及第三方应用程序(这是开源的)。脚本A.js使用execSync启动第三方应用程序。脚本B.js使用spawn启动脚本A.js。不能管,从产卵标准输出为特定应用程序

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

A.js

const { execSync } = require('child_process'); 
console.log("Hello"); 
execSync('mybinary.exe -arg1 -arg2', { stdio: 'inherit' }); 

B.js

const { spawn } = require('child_process'); 
const app = spawn(process.execPath, ['A.js'], { 
    stdio: ['inherit', null, 'inherit'] 
}); 

app.stdout.on('data', (chunk) => { 
    process.stdout.write(chunk); 
}); 

当我启动B,我只看到 “Hello”,然而二进制运行(这是一个服务器,我可以打开一个TCP连接到它)。我只是没有看到输出。当我自己启动A时,我看到“Hello”和普通二进制输出。

如果我改变B的标准输出,以“继承”,它的工作原理。

这究竟是为什么,以及如何解决这一问题?

更新:似乎与使用两个脚本没有任何关系。在不使用stdio继承的情况下直接生成二进制文件会出现同样的问题。似乎依赖于第三方应用程序。 如果程序只是打印到stdout,程序如何影响节点?

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

我试图管的具体可执行文件是一个ChatScript server

UPDATE:在这一点上,我认为它是与我试图管道的特定二进制文件的东西。我想了解二进制文件如何影响这种行为,即使用继承而不是管道。 如果有人能重新与节点脚本(或C++程序),将回答这个问题。


环境

  • 操作系统:Windows 10
  • 控制台:Cygwin的(并且也尝试定期命令提示符)。
  • 节点V7.10.0

注意,这是因为这里的同一个问题:node.js child_process.spawn no stdout unless 'inherit'

回答

1

的写道,chatscript正在做的“fprintf中(标准输出,...)”这是一个缓冲输出,并保存,直到像(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. 
+0

我有一种感觉就是这个问题。你知道为什么直接运行chatscript(节点外)为什么直接打印标准输出?是否设置某种标志来禁用(或降低)缓冲?你会看到它在一个简单的windows cmd中可以在节点外打印。 – noahnu

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 ] 
}); 

希望它能帮助,我更新它如何去;

祝你好运,

+0

没有工作当detached为真(用'shell:true'和'shell:false'测试) )没有输出写入文件,当detached为false时,只写入部分输出,就像当我在我或者管道中输入一样原始问题。作为一个侧面说明,当detached为true(并且shell为true)并且没有输出到文件时,我可以在屏幕上出现的新分离外壳中看到正确的输出。我无法捕捉那个输出。 – noahnu

相关问题