在较低级别,可以使用rtnetlink套接字捕获这些事件,而无需任何轮询。旁注:如果使用rtnetlink,则必须与udev一起使用,否则当udev重命名新的网络接口时,程序可能会感到困惑。
使用shell脚本进行网络配置的问题在于,shell脚本对于事件处理(例如插入和拔出网络电缆)非常糟糕。如果您需要更强大的功能,请查看我的NCD编程语言,这是一种专为网络配置设计的编程语言。
例如,一个简单的NCD脚本将向标准输出打印“ cable in”和“ cable out”(假设接口已经打开):
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地址将被自动删除。