특정 인터페이스가 시작되기 전에 시작될 때까지 기다리도록 시스템 서비스 단위 파일을 작성하려면 어떻게 해야 합니까?

특정 인터페이스가 시작되기 전에 시작될 때까지 기다리도록 시스템 서비스 단위 파일을 작성하려면 어떻게 해야 합니까?

데비안에서 Hostapd용 유닛 파일을 작성하려고 합니다.

Hostapd 데몬은 실행하기 전에 Wi-Fi 인터페이스와 관련된 인터페이스를 시작해야 하는 것 같습니다. 그렇지 않으면 SEGV가 사용됩니다.

network-online.target을 시도했지만 여전히 SEGV를 얻습니다. 제 생각에는 network-online.target이 인터페이스만 확인하면 되고, Wi-Fi 인터페이스가 Hostapd가 제대로 작동할 준비가 되기 전에 다른 인터페이스가 나타나기 때문인 것 같습니다.

서비스를 시작하기 전에 특정 인터페이스가 시작될 때까지 기다리게 하는 가장 좋은 방법은 무엇입니까?

답변1

systemd 219부터 다음 systemd-networkd-wait-online과 같이 systemd의 도구를 직접 사용할 수 있습니다.--interface매개변수는 대기할 인터페이스를 지정합니다. 예를 들어:

ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE

그러나주의 사항이 있습니다. systemd-networkd구성에서 아무 작업도 수행하지 않더라도 도구를 실행해야 합니다 . 반면에 동일한 systemd 219에서 시작하면 systemd-networkd소켓을 통해 활성화되고 유휴 상태일 때 자동으로 종료될 수 있습니다. 따라서 당신이 해야 할 일은 소켓에 잡아당기는 것 뿐입니다.

모두 종합하면 유닛 파일의 수정 사항은 다음과 같습니다( $IFACE원하는 인터페이스로 대체됨).

[Unit]
Requires=systemd-networkd.socket
After=systemd-networkd.socket
...

[Service]
ExecStartPre=/usr/lib/systemd/systemd-networkd-wait-online --interface=$IFACE
ExecStart=/usr/bin/hostapd ...
...

관련 정보