node.js - 未从 nodejs 产生的进程接收标准输出

标签 node.js io child-process spawn

我正在尝试让 nodejs 与冒险互动,这是一个基于文本的旧游戏。这个想法是作为一个子进程打开冒险,然后通过写信给它的stdin来玩游戏。并在 stdout 上放置一个事件监听器.

当游戏开始时,它会打印一个首字母:

Welcome to Adventure!! Would you like instructions?



所以为了说明我的问题,我有一个 nodejs+express 实例:
var childProcess = require('child_process');
var spawn = childProcess.spawn;
var child = spawn('adventure');

console.log("spawned: " + child.pid);

child.stdout.on('data', function(data) {
  console.log("Child data: " + data);
});
child.on('error', function () {
  console.log("Failed to start child.");
});
child.on('close', function (code) {
  console.log('Child process exited with code ' + code);
});
child.stdout.on('end', function () {
  console.log('Finished collecting data chunks.');
});

但是当我启动服务器时,游戏中的文本没有到达事件监听器:
spawned: 24250

这就是我得到的所有输出。 child.stdout.on甚至从未调用过监听器。为什么没有从游戏中提取那条初始线路?

如果我将以下行附加到上面的 javascript 块,那么程序输出会立即出现。所以adventure运行,我现在可以强制它触发 child.stdout.on事件监听器......但这也结束了子进程,这违背了读取和写入它的目的。
...
child.stdout.on('end', function () {
  console.log('Finished collecting data chunks.');
});
child.stdin.end();

现在输出是:
spawned: 28778  
Child data:
Welcome to Adventure!!  Would you like instructions?
user closed input stream, quitting...

Finished collecting data chunks.
Child process exited with code 0

我确信这对我来说是一个微不足道的疏忽,但我感谢任何帮助解决这个问题。

最佳答案

在多次浏览 Nodejs 文档后,我说服自己我要么遗漏了一些非常重要的东西,要么是 spawn命令工作不正常。所以我创建了一个 github issue .

答案立即发布:如果您想要快速访问,子进程不能缓冲输出。

所以为了实现我最初寻找的目标:

var childProcess = require('child_process');
var spawn = childProcess.spawn;
var child = spawn('unbuffer', 'adventure');

console.log("spawned: " + child.pid);

child.stdout.on('data', function(data) {
  console.log("Child data: " + data);
});
child.on('error', function () {
  console.log("Failed to start child.");
});
child.on('close', function (code) {
  console.log('Child process exited with code ' + code);
});
child.stdout.on('end', function () {
  console.log('Finished collecting data chunks.');
});

功能上的区别在于使用 unbuffer ,禁用输出缓冲的命令。

关于node.js - 未从 nodejs 产生的进程接收标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32598607/

相关文章:

java - java中需要抛出什么异常?

io - 将 Agda 程序输出到控制台

node.js - Node child_process 没有将所有内容写入标准输出

node.js - 在自托管 VSO 代理上运行 NPM

javascript - Node.js NPM 和 Typescript 无法从测试应用程序访问类函数

javascript - 使用 Node.js 和 Google Cloud Storage 压缩图像

javascript - 在nodejs中使用Multipart上传文件失败

java - 如何将txt文件中的行转换为字符/字符串流

c - 等待来自文件描述符的输入

node.js - 杀死 bash 脚本不会杀死子进程