Node spawn stdout.on data delay

随声附和 提交于 2019-12-12 15:00:20

问题


I am checking for USB drive removal on linux. I am simply monitoring the output of a command line process with child_process.spawn. But for some reason the child's stdout data event doesn't emit until like 20 lines have been printed, which makes it unable to detect a removed drive. After removing the drive many times, it does finally go. But obviously that won't do.

Original:

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

Pretty simple. So I figure it's an issue with the piping node is using internally. So instead of using the pipe, I figure I'll just use a simple passthrough stream. That could solve the problem and give me real-time output. That code is:

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());
});

But that gives me an error: child_process.js:922 throw new TypeError('Incorrect value for stdio stream: ' + stdio);

The documentation says you can pass a stream in. I don't see what I'm doing wrong and stepping through the child_process source didn't help.

Can someone help? You can run this yourself, provided you're on Linux. Run the code and insert a USB drive. Perhaps you can run the command 'udevadm monitor --udev' in another terminal to see what happens. Remove and reinsert a few times and eventually node will print out.


回答1:


mscdex, I love you. Changing the spawn command to

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

Did the trick. I really appreciate your help!



来源:https://stackoverflow.com/questions/27325910/node-spawn-stdout-on-data-delay

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!