На низком уровне эти события могут быть перехвачены с помощью сокетов rtnetlink без опроса. Примечание: если вы используете rtnetlink, вам придется работать вместе с udev, или ваша программа может запутаться, когда udev переименует новый сетевой интерфейс.
Проблема с настройкой сети при помощи сценариев оболочки заключается в том, что сценарии оболочки ужасны для обработки событий (например, при подключении и отключении сетевого кабеля). Если вам нужно что-то более мощное, взгляните на мой NCD язык программирования , язык программирования, разработанный для сетевых конфигураций.
Например, простой сценарий NCD, который будет печатать «кабель» и «кабель» на стандартный вывод (при условии, что интерфейс уже подключен):
process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Print "cable in" when we reach this point, and "cable out"
# when we regress.
println("cable in"); # or pop_bubble("Network cable in.");
rprintln("cable out"); # or rpop_bubble("Network cable out!");
# just joking, there's no pop_bubble() in NCD yet :)
}
(внутри net.backend.waitlink()
использует rtnetlink, а net.backend.waitdevice()
использует udev)
Идея NCD заключается в том, что вы используете его исключительно для настройки сети, поэтому обычно команды конфигурации могут находиться между ними, например:
process foo {
# Wait for device to appear and be configured by udev.
net.backend.waitdevice("eth0");
# Set device up.
net.up("eth0");
# Wait for cable to be plugged in.
net.backend.waitlink("eth0");
# Add IP address to device.
net.ipv4.addr("eth0", "192.168.1.61", "24");
}
Важной частью, на которую следует обратить внимание, является то, что выполнение может регрессировать ; во втором примере, например, при извлечении кабеля IP-адрес будет автоматически удален.