Systemd는 서비스를 실행하기 전에 네트워크 인터페이스가 시작될 때까지 기다립니다.

Systemd는 서비스를 실행하기 전에 네트워크 인터페이스가 시작될 때까지 기다립니다.

systemd에 관해 몇 가지 질문이 있습니다. 네트워크 인터페이스가 작동되면 항상 스크립트를 실행할 수는 없습니다. 아래와 같이 Requires 및 After를 시도했지만 네트워크가 시작될 때까지 기다리는 것과 일치하지 않습니다. 올바른 서비스를 사용하고 올바르게 구현하고 있나요? 이 문제를 해결하기 위해 지금은 매우 비효율적이고 해키적인 핑 확인 루프를 실행하고 있습니다. 어떤 제안이라도 좋을 것입니다. 감사해요!

[Unit]
Description=PBU installer
Requires=network-online.service
After=network-online.service

[Service]
Type=oneshot
ExecStart=/home/pbu/current/scripts/pbu-unpack.sh
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

답변1

다음 출력을 보고 문제를 해결했습니다.

systemctl list-units --no-pager

이것은 모든 네트워크 장비처럼 제가 생각하지 못했던 많은 장치를 보여주었습니다!

sys-devices-virtual-net-lan0.device loaded active plugged   /sys/devices/virtual/net/lan

그래서 나는 추가했다

BindsTo=sys-devices-virtual-net-lan0.device
After=sys-devices-virtual-net-lan0.device

내 조직 서비스 파일에 추가하면 lan0을 사용할 수 있을 때까지 내 서비스가 시작되지 않습니다.

답변2

이는 잘못된 것 같습니다. 올바른 이름은 network-online.target존재 network-online.service하지 않습니다(Fedora 26에서 테스트됨).

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/

답변3

오래된 스레드를 되살리면 일부 사람들이 유용하다고 생각할 수 있기를 바랍니다. RPi의 nftables에서 무선 인터페이스를 사용해야 하는데 가끔 연결하는 데 시간이 오래 걸립니다. 나는 다음을 추가했다:

ExecStartPre=timeout 60s bash -c 'until ip a s dev wlan0; do sleep 1; done'

nftables.service 장치로 이동하여 작동시키세요. ExecPreStart=sleep 60약간 어리석어 보이는 것 외에도 여기에 있는 다른 솔루션 중 어느 것도 안정적으로 작동하지 않습니다. 인터페이스가 나타나면 루프가 종료되지만 until내 nft 규칙에는 IP가 필요하지 않기 때문에 아직 IP가 없습니다. 파이프를 전달하면 grep '\([0-9]\{1,3\}\.\)\{3\}[0-9]\{1,3\}\/[0-9]\{1,2\}'IPV4 주소를 기다리게 됩니다.

답변4

을 포함시켜 보셨나요 Requires=network-online.target? My Arch 및 CentOS 설치에는 기본적으로 이 대상이 있습니다. 이는 목표이기 때문에 단순히 단일 서비스를 시작하는 것이 아니라 시작 중에 시스템이 특정 이정표에 도달했음을 나타냅니다. 그래도 문제가 해결되지 않으면 네트워크 연결이 필요한 다른 서비스 장치와 비교해 보십시오.

관련 정보