【问题标题】:Node spawn stdout.on data delay节点生成 std​​out.on 数据延迟
【发布时间】: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 所示?

标签: linux node.js pipe spawn


【解决方案1】:

mscdex,我爱你。将 spawn 命令更改为

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

成功了。非常感谢您的帮助!

【讨论】:

  • 嗨,这不适用于 tcpdump ,知道为什么吗?
猜你喜欢
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-26
  • 1970-01-01
相关资源
最近更新 更多