【发布时间】:2015-02-04 05:09:09
【问题描述】:
我正在检查 Linux 上的 USB 驱动器删除。我只是用 child_process.spawn 监视命令行进程的输出。但是由于某种原因,孩子的 stdout 数据事件直到打印了 20 行之后才会发出,这使得它无法检测到已移除的驱动器。多次卸下驱动器后,它终于走了。但显然那是不行的。
原文:
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 throw new TypeError('stdio stream的值不正确:' + stdio);
文档说你可以传入一个流。我看不出我做错了什么,单步执行 child_process 源也没有帮助。
有人可以帮忙吗?你可以自己运行它,前提是你在 Linux 上。运行代码并插入 USB 驱动器。也许您可以在另一个终端中运行命令“udevadm monitor --udev”来查看会发生什么。删除并重新插入几次,最终节点将打印出来。
【问题讨论】:
-
您是否尝试将命令行更改为使用
stdbuf以避免标准输出缓冲,如here 所示?