Node spawn stdout.on data delay

问题描述 投票:3回答:2

我正在检查Linux上USB驱动器的拆卸。我只是使用child_process.spawn监视命令行过程的输出。但是由于某种原因,直到打印了20行,孩子的stdout数据事件才会发出,这使其无法检测到卸下的驱动器。多次卸下驱动器后,它终于走了。但这显然不会。

原文:

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('stdio流的值不正确:'+ stdio);

文档说您可以传递流。我看不到我做错了,单步执行child_process源无济于事。

有人可以帮忙吗?如果您使用的是Linux,则可以自己运行。运行代码并插入USB驱动器。也许您可以在另一个终端上运行命令“ udevadm monitor --udev”以查看会发生什么。删除并重新插入几次,最终将打印出节点。

linux node.js pipe spawn
2个回答
3
投票

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

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

有花招。非常感谢您的帮助!


0
投票

我可以使用哪种Windows解决方案。很抱歉在答案框中提出问题

© www.soinside.com 2019 - 2024. All rights reserved.