네트워크 인터페이스가 열리거나 닫힐 때 Systemd 서비스가 실행됩니다(eth0).

네트워크 인터페이스가 열리거나 닫힐 때 Systemd 서비스가 실행됩니다(eth0).

eth0이 가동/중단될 때마다 시스템 서비스를 실행하고 싶습니다(별도의 가동/중단 서비스일 수도 있음). 이 값은 이더넷이 연결되면 변경되어야 합니다. 누구든지 이것을 달성하는 방법을 알고 있습니까?

X초마다 폴링하는 bash 스크립트를 작성할 수 있지만 그렇게 하면 아마도 내가 원하는 것보다 더 많은 CPU를 소비하게 될 것이고 구현이 깨끗하지 않을 수도 있습니다.

어떤 제안이라도 환영합니다. 감사해요!

답변1

이더넷 가동/중단 이벤트(및 기타)는 netlink 소켓을 통해 커널에 의해 보고됩니다. ip monitor폴링을 피하기 위해 쉘 스크립트에서 사용될 수 있는 를 사용하여 메시지를 볼 수 있습니다 .

또한 데비안에는 적어도 하나의 패키지가 있다는 것을 알았습니다.네트워크 플러그는 netlink 메시지를 수신한 다음 링크 추가, 업링크 및 다운링크에서 셸 스크립트를 실행하는 데몬 프로세스입니다. 그런 다음 쉘 스크립트를 사용하여 systemctl장치를 시작/중지할 수 있습니다.

(아마도 네트워크 관리자와 systemd-networkd도 이러한 이벤트를 수신하고 스크립트를 연결하는 방법이 있을 수 있지만 사용하지 않는 것 같습니다.)

답변2

UBUNTU 서버에서 다음을 수행하여 wlp3S0(WLAN) 인터페이스에 종속적인 Hostapd 서비스를 만들었습니다.

[Unit]
Wants=network-online.target
BindsTo=sys-subsystem-net-devices-wlp3s0.device
After=sys-subsystem-net-devices-wlp3s0.device
Requires=systemd-networkd.socket
After=systemd-networkd.socket
After=network-online.target

답변3

ServerFault에 관한 이 질문에 관하여[Install]솔루션을 표현하는 것은 사용자 정의 서비스 섹션에 한 줄을 추가하는 것만큼 간단합니다.

[Install]
WantedBy=<the appropriate device unit>.device

한편, 시스템 네트워크 연결이 온라인 상태인 동안 서비스를 시작하려는 경우,어떤 유형의 네트워크 연결에 관계없이, 그런 다음 systemd 버전과 관련된 man systemd.special사용 지침을 검토하고 읽으십시오. network-online.target내 시스템의 systemd 버전에 대해 권장되는 단계는 이를 서비스에 추가하는 것입니다.

[Unit]
Wants=network-online.target
After=network-online.target

...하지만 여기서는 systemd 버전에 따라 다른 지침이 표시되는 것 같으니 먼저 배포판을 확인하세요 man systemd.special.

관련 정보