Node.js 使用命名管道作为stdin生成节点子进程

Node.js 使用命名管道作为stdin生成节点子进程,node.js,named-pipes,Node.js,Named Pipes,假设我在linux上有一个命名管道: mkfifo lk.log 在命令行中,我可以这样做来打印写入名称管道文件的任何内容 node monitor.js < lk.log 如何使用子进程在节点内执行此操作。生成子进程? child_process.spawn('node', ['monitor.js'])... 最简单的方法是使用exec(): var exec=require('child_process')。exec; exec('node monitor.js

假设我在linux上有一个命名管道:

mkfifo lk.log
在命令行中,我可以这样做来打印写入名称管道文件的任何内容

node monitor.js < lk.log
如何使用子进程在节点内执行此操作。生成子进程?

child_process.spawn('node', ['monitor.js'])...

最简单的方法是使用
exec()

var exec=require('child_process')。exec;
exec('node monitor.js

更复杂的方法是在节点中打开命名管道,并将其作为stdin传递给正在生成的进程(请参见)。

答案是使用
fs.open
child\u process.spawn
中的stdio选项:

var spawn = require('child_process').spawn;

var fd_stdin = fs.openSync('lk.log', 'r');
spawn('node', ['monitor.js'], {
    stdio: [fd_stdin, 1, 2];
});
来自Ben Noordhuis(核心节点贡献者)-2011年10月11日

Windows有命名管道的概念,但自从您提到
mkfifo
I 假设您指的是UNIX FIFO

我们不支持它们,可能永远也不会支持(非阻塞中的FIFO) 模式有可能使事件循环死锁),但您可以使用 UNIX套接字,如果您需要类似的功能


对于unix套接字,请参阅:

子进程.exec
对我没有帮助,因为它等待子进程终止,然后才能从子进程的stdout.Oops读取数据,您是对的。我猜为spawn检查stdio选项是您唯一的选择。
var exec = require('child_process').exec;

exec('node monitor.js < lk.log', function(err, stdout, stderr) {
  ...
});
var spawn = require('child_process').spawn;

var fd_stdin = fs.openSync('lk.log', 'r');
spawn('node', ['monitor.js'], {
    stdio: [fd_stdin, 1, 2];
});