2014-12-05 54 views
2

我正在检查Linux上的USB驱动器删除。我只是用child_process.spawn监视命令行进程的输出。但是由于某种原因,直到20行被打印出来,这个孩子的标准输出数据事件才会发出,这使得它无法检测到移除的驱动器。多次拆下驱动器后,它终于结束了。但显然这不会。节点产卵stdout.on数据延迟

原文:

var udevmonitor = require("child_process").spawn("udevadm", ["monitor", "--udev"]); 
 
udevmonitor.stdout.on("data", function(data) { 
 
    return console.log(data.toString()); 
 
});

很简单。所以我认为这是管道节点在内部使用的问题。因此,我不使用管道,而是使用简单的传递流。这可以解决问题,并给我实时输出。这代码:

var stdout = new require('stream').PassThrough(); 
 
require("child_process").spawn("udevadm", ["monitor", "--udev"], { stdio: ['pipe', stdout, 'pipe'] }); 
 

 
stdout.on("data", function(data) { 
 
    console.log(data.toString()); 
 
});

但是,这给了我一个错误: child_process.js:922抛出新的TypeError( '为标准输入输出流不正确的值:' +标准输入输出);

该文档说你可以传入一个流。我没有看到我在做什么错误,并且逐步通过child_process源并没有帮助。

有人可以帮忙吗?你可以自己运行,只要你在Linux上。运行代码并插入USB驱动器。也许你可以在另一个终端运行'udevadm monitor --udev'命令来看看会发生什么。删除并重新插入几次,最终节点将打印出来。

+1

您是否尝试更改命令行以使用'stdbuf'来避免标准输出缓冲,如[here](http://unix.stackexchange.com/a/25378)所示? – mscdex 2014-12-05 23:31:32

回答

2

mscdex,我爱你。更改产卵命令

spawn("stdbuf", ["-oL", "-eL", "udevadm", "monitor", "--udev"]);

的伎俩。我非常感谢你的帮助!

+0

嗨,这不适用于tcpdump,有些想法为什么? – 2016-08-15 15:21:50