不是从接收的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
,即禁止输出缓冲的命令。