最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

不是从接收的NodeJS stdout中衍生的进程

运维笔记admin14浏览0评论

不是从接收的NodeJS stdout中衍生的进程

不是从接收的NodeJS stdout中衍生的进程

我想有使用的NodeJS冒险,一个古老的基于文本的交互游戏。我们的想法是打开的冒险作为一个子进程,然后通过写入其stdin,并把事件监听器stdout玩游戏。

游戏开始时,它打印初始:

欢迎冒险!你想说明?

所以,来说明我的问题,我有一个+的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,即禁止输出缓冲的命令。

发布评论

评论列表(0)

  1. 暂无评论