Я пишу скрипт NodeJS, который взаимодействует со сторонним приложением.Стороннее приложение будет записывать данные в файл на время его открытия.Я бы хотел, чтобы мое приложение NodeJS получало эти данные в режиме реального времени.
Мой сценарий создает fifo:
child_process.spawnSync('mkfifo', [pipePath]);
Затем он запускает стороннее приложение, используя child_process.spawn
.Наконец, он читает из канала.
let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDONLY);
let stream = fs.createReadStream(null, {fd: pipeHandle, autoClose: false});
stream.on('data', d => {
console.log(d.length);
});
Это прекрасно работает, если работает стороннее приложение.Однако при определенных обстоятельствах стороннее приложение будет завершено без записи в файл / FIFO.В этом случае вызов fs.open () в моем скрипте блокируется навсегда.(См. эту связанную проблему на GitHub)
В попытке исправить это я использовал
let pipeHandle = await promisify(fs.open)(pipePath, fs.constants.O_RDONLY | fs.constants.O_NONBLOCK);
Это предотвращает зависание моего сценария в случае сбоя стороннего приложения, но теперь событие data никогда не запускается, даже если стороннее приложение работает правильно.Мне интересно, если открытие FIFO с O_NONBLOCK не считается открытием для чтения?
Я не уверен, что лучший способ решить это.В настоящий момент я рассматриваю возможность запуска стороннего приложения, ожидающего 10 секунд, проверяющего, запущено ли оно и ТОГДА открывающего fifo для чтения, так как стороннее приложение может быстро выйти из строя, если вообще не получится.Но это взлом, поэтому мне интересно, какое решение лучше.
Спасибо!