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