LINUX.ORG.RU

Как отслеживать изменения в /sys/class/net?


0

1

Есть необходимость отслеживать состояние ethernet-подключения. Да, можно в консоли выполнить

cat /sys/class/net/eno1/carrier

и

cat /sys/class/net/eno1/operstate

и сделать выводы.

Можно сделать что-то вроде system("cat /sys/class/net/eno1/carrier"), но как-то это мне не нравится.

inotify не хочет работать с /sys.

Как это сделать лучше из программы? Я могу открыть файлы, прочитать из них данные и обработать их. Нормально ли открывать их раз в секунду? Может, есть еще какие-то способы?

★★

Можно сделать что-то вроде system(«cat /sys/class/net/eno1/carrier»), но как-то это мне не нравится.

Не понял к чему ты это написал. Зачем делать эту чушь когда файл можно открыть безо всяких system()?

Нормально ли открывать их раз в секунду?

Нет, но в линуксе так принято, так что открывай. Или жди пока туда inotify прикрутят.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Не понял к чему ты это написал. Зачем делать эту чушь когда файл можно открыть безо всяких system()?

Написал потому, что это тоже можно делать, но, по-моему, слишком нагрузит систему (embedded, да, не в чистом виде, но ресурсы ограничены).

braboar ★★
() автор топика

можно пасти syslog на предмет строк Link is Down/Link is Up

более правильный вариант - получать по netlink события NETDEV_UP/NETDEV_DOWN

в udev такое вроде не приходит, но можно попробовать

SUBSYSTEM=="net", RUN+="/path/to/udev-net-event.sh"

возможно это зависит от драйвера

sergej ★★★★★
()
Ответ на: комментарий от xionovermazes

Судя по:

The Linux Audit system provides a way to track security-relevant information on your system. Based on pre-configured rules, Audit generates log entries to record as much information about the events that are happening on your system as possible.

audit пишет в лог, а мне бы надо в программе смотреть состояние подключения. Или я чего-то не понял?

braboar ★★
() автор топика
Ответ на: комментарий от braboar

да он пишет в лог. я думал, что можно как то аудит настроить на эти события сетевых интерфейсов - потом читать лог, выявить в нем сигнатуру аудит-сообщения нужного тебе. ну и использовать это как триггер.

Существует аудит файловой системы, но скорее всего он под капотом этот inotify и использует. Возможно это можно как то хитрее, например событие_аудит SYSCALL отловить какое-нибудь.

P.S У меня аудитктл во всяком случае ошибок не выдал на вот это:

sudo auditctl -w /sys/class/net/eno1/carrier -p wa -k carrier_watch

xionovermazes
()

лучше посмотри, как это в ifplugd сделано и не изобретай велосипед

во, кстати, даже man-страница на эту тему есть: https://www.opennet.ru/man.shtml?topic=rtnetlink&category=7&russian=0

demidrol ★★★★★
()
Последнее исправление: demidrol (всего исправлений: 1)
Ответ на: комментарий от demidrol

во, кстати, даже man-страница на эту тему есть:https://www.opennet.ru/man.shtml?topic=rtnetlink&category=7&russian=0

Немного не о том:

Rtnetlink позволяет читать и изменять таблицы маршрутизации ядра.

braboar ★★
() автор топика
Ответ на: комментарий от braboar

Ну сначала определить состояние интерфейса да, SIOCGIFFLAGS, а ждать изменение состояния можно через netlink.

Незнаю, умеет ли оно сообщать о потере линка.

Удаление сетевой карты это и выгрузка драйвера.

vel ★★★★★
()