LINUX.ORG.RU

Детект изменения состояния сетевых подключений

 ,


0

2

Есть некое embedded устройство с linux. На нем работает некий демон, запускаемый через systemd.

Задача - перезапуск демона при изменении подключения к сети. То есть если поднято/опущено любое сетевое соединение.

Для перезапуска достаточно завершить демон, systemd его само запускает обратно.

Вопрос - как наиболее просто и надежно это сделать, крайне желательно изнутри демона? Демон на языке C.

Что пробовал:

int nl_socket = socket (AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
addr.nl_family = AF_NETLINK;
addr.nl_pid = getpid ();
addr.nl_groups = RTMGRP_LINK | RTMGRP_IPV4_IFADDR | RTMGRP_IPV6_IFADDR;
bind (nl_socket, (struct sockaddr *) &addr, sizeof (addr));

и так далее. В целом это работает, но столкнулся с проблемой - если в сети выполнить arp-scan, срабатывает такой детектор и демон неправомерно перезапускается.

Как это сделать минимально сложно и максимально надежно?

Подозреваю, что лучше смотреть в сторону самого systemd. Более чем уверен, что там твоя хотелка уже есть.

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

А и правда. Получается, надо запустить NetworkManager-dispatcher.service и в /etc/NetworkManager/dispatcher.d/ добавить скрипт, который будет делать systemctl restart.

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

Запусти «ip mon» и посмотри какие события тебе нужны.

Заодно, запусти arp-scan и посмотри как «ip mon» на это реагирует.

Потом посмотри как «ip mon» читает эти события. Исходники iproute2 достаточно простые.

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

embedded устройство

systemd

Толсто.

Нормально. При наличии памяти и нескольких ядер вполне может быть оправдано: загрузка быстрее, DHCP без бубна.

AlexVR ★★★★★
()

через dbus можешь получить необходимую информацию из networkd

EugeneBas ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.