Откуда ethtool получает информацию?

Итак, две проблемы:

  1. Нежелательные совпадения :Это связано с тем, что вы не заканчивали каждое предложение шаблона $ в конце, чтобы указать, что вы хотите сопоставить abced , за которым следует ничего .seq _10140соответствует ли seq _1014 , потому что seq _1014есть там (где-то ). Вы не сказали, что еще один символ в конце вызовет ошибку, сказав seq _1014$ .
  2. Несоответствие, когда должно быть. :Эта часть работает в моей системе, когда я копирую ваш код и ваши входные файлы. 1039 и так далее соответствуют . Все, о чем я могу думать, это то, что ваш $pat состоит всего из одного предложения из-за какой-то проблемы с вашим файлом шаблона, который был исправлен путем вырезания -и -вставки его в этот форум и из него. Обычно это означает, что в конце каждой строки в стиле DOS есть два символа End Of Line , и при первом чтении считывается весь файл. Однако есть множество других вещей, которые могут быть с ними неправильными. Возьмите его в отладку или просто добавьте операторы печати, чтобы увидеть, что находится в @headers и $pat . Получите байт -на -байт вывода файла с помощью программы «C» или Emacs в «режиме hexl -», чтобы увидеть, не сбивает ли что-то там ваши чтения.
3
11.08.2019, 15:40
1 ответ

ethtoolполучает статистику с помощью SIOCETHTOOLioctl, который принимает указатель на struct ethtool_stats. Чтобы получить статистику, поле cmdструктуры должно иметь значение ETHTOOL_GSTATS. Прежде чем вызывать этот ioctl, вы должны использовать другой ethtool ioctl (также SIOCETHTOOLлибо с указателем на struct ethtool_sset_infoс его полем cmd, инициализированным значением ETHTOOL_GSSET_INFO, либо с указателем на struct ethtool_drvinfoс его cmd. ] поле инициализировано значением ETHTOOL_GDRVINFO), чтобы узнать количество различных значений статистики, которые драйвер собирается вернуть, чтобы вы могли выделить достаточно памяти для struct ethtool_stats.

...И если вы не программируете на C, очень плотное, богатое -жаргоном описание, приведенное выше, вероятно, не имело для вас никакого смысла. Если вам нужно получить доступ к статистике ethtoolв сценарии, я бы рекомендовал использовать язык сценариев, который имеет доступные привязки для интерфейса ethtool,например Perl (модульLinux::Ethtool)или Python (по-видимомуhttps://pypi.org/project/netifaces/). Это должно упростить доступ к статистике.

Конечно, вы всегда можете проанализировать вывод команды ethtool, но если вы хотите опрашивать статистику каждую секунду, может быть полезно исключить необходимость vfork()запускать один или два новых процесса каждый раз, когда вы нужна статистика.

Результирующие значения поступают от драйвера сетевой карты. Тот факт, что разработчик драйвера не добавил код для доступа к соответствующей статистике ни через /sys/class/net/<name>/statistics, ни через /proc/net/dev, откуда ifconfigполучает их, предполагает, что драйвер может определять эти значения несколько иначе, чем /proc/net/devи/ или /sys/class/net/*/statistics... или это может просто указывать на то, что реализация драйвера, к сожалению, не идеальна.

(Разработчик, возможно, решил сначала реализовать ethtoolAPI, поскольку он является самым новым, и оставил старые интерфейсы статистики незавершенными, «когда у меня будет время». Также обратите внимание, что команда ifconfigустарела в большинстве дистрибутивов, поскольку она больше не поддерживается должным образом.)

Чтобы узнать подробности, вам, возможно, придется прочитать документацию и/или комментарии к исходному коду самого драйвера. Поскольку вы не указали ни модель сетевой карты, ни имя драйвера, никто другой не сможет это сделать за вас. Выходные данные ethtool -i wlp2s0будут очень полезны для идентификации драйвера сетевой карты.

5
27.01.2020, 21:21

Теги

Похожие вопросы