데비안 systemd network-online.target이 작동하지 않습니까? 시점과 network-online.target동시에 발생 network.target합니다. 이 문제는 레거시 네트워크

데비안 Jessie에서 시스템 서비스를 만들려고합니다. network-online.target도달 한 후에 시작해야합니다 .

문제는 인터페이스가 아직 구성되지 않은 동시에 DHCP 쿼리를 시작한 시점과 network-online.target동시에 발생 network.target합니다.

이 문제는 레거시 네트워크 구성을 사용하기 때문에 데비안에만 해당되는 것 같습니다.

이 문제를 우회하거나 어떻게 network-online.target작동 시키는가?



답변

를 사용하고 있으므로 /etc/network/interfaces각 인터페이스의 상태를 모니터링하려면 시스템 서비스가 필요합니다. /lib/systemd/system/ifup-wait-all-auto.service( ifupdownUbuntu 15.04 의 패키지로 설치되어 있는지) 확인하십시오 . 그렇지 않은 경우을 만들고 /etc/systemd/system/ifup-wait-all-auto.service다음을 붙여 넣습니다.

[Unit]
Description=Wait for all "auto" /etc/network/interfaces to be up for network-online.target
Documentation=man:interfaces(5) man:ifup(8)
DefaultDependencies=no
After=local-fs.target
Before=network-online.target

[Service]
Type=oneshot
RemainAfterExit=yes
TimeoutStartSec=2min
ExecStart=/bin/sh -ec '\
  for i in $(ifquery --list --exclude lo --allow auto); do INTERFACES="$INTERFACES$i "; done; \
  [ -n "$INTERFACES" ] || exit 0; \
  while ! ifquery --state $INTERFACES >/dev/null; do sleep 1; done; \
  for i in $INTERFACES; do while [ -e /run/network/ifup-$i.pid ]; do sleep 0.2; done; done'

[Install]
WantedBy=network-online.target

이것은 Ubuntu 15.04 시스템에있는 서비스 파일이지만 [Install]조금 더 쉽게하기 위해 섹션이 추가되었습니다. 나는의 동작 바라고 ifup우분투 15.04에가의 동작과 동일 ifup데비안 제시한다. 그렇지 않은 경우, 특히 마지막 줄을 수정해야합니다.

그런 다음을 실행하십시오 sudo systemctl enable ifup-wait-all-auto.service. 컴퓨터를 다시 부팅 한 후 network-online.target인터페이스가 시작된 후에 도달 한 것을 확인할 수 있습니다 (적어도).


답변

주의! Raspbian Jessie에서 알아 냈습니다 : / etc / network 인터페이스에서 주석 처리 된 모든 줄을 제거하면 작동합니다! 파싱 ​​버그 인 것 같습니다. =) 특정 경우에는 코멘트를 남기고 iface eth0 inet dhcp방금 전에 잊어 버렸습니다. 그러나 Raspbian Jessie로 업그레이드하고 커널을 다시 빌드 한 후 매우 이상한 동작이 발생했습니다 .DHCP를 사용하고 거부했습니다. / etc / network / interfaces에서 조정하십시오. 그래서 나는 작업 라인, 재부팅 만하면 주석에서 그것을 제거했습니다. 스크립트 패치 / 편집이 필요하지 않습니다!


답변

https://www.freedesktop.org/wiki/Software/systemd/NetworkTarget/ 서비스를 시작하기 위해 권장되는 방법 후에 네트워크가 수평는 “사용하는 것입니다 network-online.target 에서” .service의 파일 :

 "After=network-online.target"
 "Wants=network-online.target"

그러나 ” network-online.target “을 사용하고 네트워킹이 완전히 수평이 아니기 때문에 서비스가 실패한 후 버그 ( https://github.com/coreos/bugs/issues/1966 )가 있음을 발견 했습니다. 100 % 오류가 없습니다.

실제로 ” NetworkManager ” 와 같은 동적 네트워킹 구성 도구 가이 경우와 같이 사용되는 경우 네트워킹 상태는 100 % 정확하거나 예측할 수 없습니다. 버그를 설명하는 링크에서 ” network-online.target “은 사용되는 다른 응용 프로그램에 따라 일관되지 않게 작동 할 수 있습니다.

해결 방법 :
서비스의 시작 순서를 분석하고 ” network-online.target ” 이후에 시작되는 순서를 사용해야합니다 .

 systemd-analyze plot > /home/pi/graph.svg

이는 네트워킹 수준이 유지되고 오류없이 서비스가 시작될 수있는 서비스를 찾을 때까지 대상을 이후 및 이후 서비스로 점진적으로 변경하는 반복적 인 프로세스입니다. 제 경우 sleep 10에는 SystemD 서비스가 호출 한 스크립트를 스크립트에 넣어야했습니다.


답변

한 번 Github 에서 지속적으로 서버를 핑하려고 시도하여 해결 한 답변을 찾았습니다 . Ping을 통과 한 경우에만 서비스가 계속됩니다.

[Service]
ExecStartPre=/bin/sh -c 'until ping -c1 google.com; do sleep 1; done;'
ExecStart=<your command>

google.com주 스크립트가 서버에 연결해야했기 때문에 자체 서버 로 교체 했습니다.