低レベルでは、これらのイベントは、ポーリングなしでrtnetlinkソケットを使用してキャッチできます。補足:rtnetlinkを使用する場合、udevと連携する必要があります。そうしないと、udevが新しいネットワークインターフェースの名前を変更するときにプログラムが混乱する可能性があります。
シェルスクリプトを使用してネットワーク構成を行う場合の問題は、シェルスクリプトがイベント処理(ネットワークケーブルのプラグインとプラグアウトなど)に適していないと言うことです。より強力なものが必要な場合は、ネットワーク構成用に設計されたプログラミング言語であるNCDプログラミング言語をご覧ください。
たとえば、「ケーブル入力」および「ケーブル出力」をstdoutに出力する単純な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");
}
注意すべき重要な部分は、実行が後退することが許可されていることです。たとえば、2番目の例では、ケーブルが引き抜かれると、IPアドレスが自動的に削除されます。