낮은 수준에서 이러한 이벤트는 폴링없이 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");
}
주목해야 할 중요한 부분은 실행이 회귀 된다는 것입니다 . 예를 들어, 케이블을 뽑으면 IP 주소가 자동으로 제거됩니다.