0

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

mkfifo lk.log

从命令行,我可以打印出任何写入名称管道文件的内容。

node monitor.js < lk.log

并假装这就是脚本的样子

// monitor.js

process.stdin.resume();
process.stdin.setEncoding('utf8');

// read data from stdin
process.stdin.on('data', function(chunk) {
    console.log(chunk);
});

我怎么能在节点内使用 child_process.spawn

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

3 回答 3

1

答案是这样使用fs.open和 stdio 选项child_process.spawn

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

var fd_stdin = fs.openSync('lk.log', 'r');
spawn('node', ['monitor.js'], {
    stdio: [fd_stdin, 1, 2];
});
于 2013-03-25T22:45:15.017 回答
1

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

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

exec('node monitor.js < lk.log', function(err, stdout, stderr) {
  ...
});

更复杂的方法是在 node 中打开命名管道并将其作为标准输入传递给您正在生成的进程(请参阅spawn的选项stdio)。

于 2013-03-25T21:12:06.433 回答
0

来自 Ben Noordhuis(核心节点贡献者) - 2011 年 10 月 11 日

Windows 有一个命名管道的概念,但既然你提到mkfifo我假设你的意思是 UNIX FIFO。

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

https://groups.google.com/d/msg/nodejs/9TvDwCWaB5c/udQPigFvmgAJ

对于 unix 套接字,请参阅:https ://stackoverflow.com/a/18226566/977939

于 2013-08-14T08:41:41.957 回答