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 설치에는 기본적으로 이 대상이 있습니다. 이는 목표이기 때문에 단순히 단일 서비스를 시작하는 것이 아니라 시작 중에 시스템이 특정 이정표에 도달했음을 나타냅니다. 그래도 문제가 해결되지 않으면 네트워크 연결이 필요한 다른 서비스 장치와 비교해 보십시오.