说我在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'])...
答案 0 :(得分:1)
最简单的方法是使用exec()
:
var exec = require('child_process').exec;
exec('node monitor.js < lk.log', function(err, stdout, stderr) {
...
});
更精细的方法是在节点中打开命名管道并将其作为stdin传递给您正在产生的进程(参见the option stdio
for spawn)。
答案 1 :(得分:1)
答案是使用fs.open
和child_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];
});
答案 2 :(得分:0)
来自Ben Noordhuis(核心节点撰稿人) - 10/11/11
Windows有一个命名管道的概念,但是你提到
mkfifo
我 假设您的意思是UNIX FIFO。我们不支持它们,也许永远不会支持它们(非阻塞的FIFO) 模式有可能使事件循环死锁)但你可以使用 UNIX套接字,如果您需要类似的功能。
https://groups.google.com/d/msg/nodejs/9TvDwCWaB5c/udQPigFvmgAJ
对于unix套接字,请参阅:https://stackoverflow.com/a/18226566/977939