Re: NJS - Неправильное чтение файла

Dmitry Volyntsev xeioex на nginx.com
Чт Апр 16 12:40:17 UTC 2020



> On 16 Apr 2020, at 00:41, edc <nginx-forum на forum.nginx.org> wrote:
> 
> Возникла необходимость читать счётчики с сетевых интерфейсов. Метрика
> доступна в файле /sys/class/net/eth0/statistics/rx_bytes 
> NJS возвращает текущее значение и вдобавок к метрике мусор. Похоже весь файл
> читается блоком в 4K. Если тот-же код выполнить в ноде - результат
> корректен.  Правильное ли это поведение njs?
> 
> Пример кода -  test.js
> 
> var fs = require('fs')
> var file = fs.readFileSync('/sys/class/net/eth0/statistics/rx_bytes')
> var file = fs.writeFileSync('filecopy.txt', file)
> 
> Проверка:
> 
> stat /sys/class/net/wlp61s0/statistics/rx_bytes
> 
> File: /sys/class/net/wlp61s0/statistics/rx_bytes
> Size: 4096            Blocks: 0          IO Block: 4096   regular file
> 
> njs  test.js
> stat filecopy.txt 
> 
> File: filecopy.txt
> Size: 4096            Blocks: 8          IO Block: 4096   regular file
> 
> node test.js
> stat filecopy.txt 
> 
> File: filecopy.txt
> Size: 10              Blocks: 8          IO Block: 4096   regular file
> 
> Версии:
> njs -v
> 0.3.9
> 
> node -v
> v8.10.0
> 
> Проверял на Ubuntu 18.04.4 LTS и так же в Docker nginx:latest
> 
> Posted at Nginx Forum: https://forum.nginx.org/read.php?21,287667,287667#msg-287667


Могу подтвердить проблему, исправим в ближайших релизах. 
njs сейчас доверяет размеру файла полученного через fstat(), который составляет 4096.

В качество workaround могу предложить следующее

: var fs = require(‘fs’)
: var file = fs.readFileSync('/sys/class/net/eth0/statistics/rx_bytes’)
: var rx_bytes = Number(file.slice(0, file.indexOf(‘\n’)));



> 
> _______________________________________________
> nginx-ru mailing list
> nginx-ru на nginx.org
> http://mailman.nginx.org/mailman/listinfo/nginx-ru



Подробная информация о списке рассылки nginx-ru