【发布时间】:2017-06-03 13:26:50
【问题描述】:
我有两个脚本 A.js 和 B.js,以及一个 3rd 方应用程序(它是开源的)。脚本 A.js 使用 execSync 启动第 3 方应用程序。脚本 B.js 使用 spawn 启动脚本 A.js。
如果我自己运行脚本 A.js,我可以看到第 3 方应用程序的整个输出。当我通过运行脚本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 继承的情况下直接生成二进制文件会出现同样的问题。似乎依赖于第三方应用程序。 如果程序只是打印到标准输出,它会如何影响节点?
上下文:我想启动一个服务器,然后在服务器准备好时运行一个命令。准备就绪后,服务器会打印出特定消息。这个想法是等待这条消息被打印出来。打印出这条消息后,它不会打印出任何其他内容,而是继续运行。
我试图通过管道传输的特定可执行文件是 ChatScript server。
更新:在这一点上,我假设它与我正在尝试传输的特定二进制文件有关。我想了解二进制文件如何影响这种行为,即使用继承而不是管道。 如果有人可以使用节点脚本(或 c 程序)重新创建此行为,那将回答这个问题。
环境
- 操作系统:Windows 10
- 控制台:Cygwin(也尝试了常规命令提示符)。
- 节点 v7.10.0
请注意,这与此处的问题相同:node.js child_process.spawn no stdout unless 'inherit'
【问题讨论】: