이렇게 하면 "인터넷 연결"이 있는지 확인할 수 있습니다. "인터넷 연결"이 없는 경우(이 두 위치에 성공적으로 ping됨) 600초 동안 기다린 후 계속됩니다.
ping -W 1 -c 4 www.google.com >& /dev/null && ping -W 1 -c 4 www.yahoo.com >& /dev/null || sleep 600
하지만: 인터넷에 연결될 때까지 반복되도록 이 줄을 어떻게 다시 작성할 수 있습니까?
답변1
while ! ping -W 1 -c 4 www.google.com >& /dev/null ||
! ping -W 1 -c 4 www.yahoo.com >& /dev/null; do
sleep 600
done
IP 주소에 대한 연결을 테스트하고 있지만 8.8.8.8은 Google의 공개 DNS 서버입니다(가용성이 매우 높습니다). 항목이 캐시에 있을 수 있으므로 DNS가 작동하는지 테스트하는 것은 어쨌든 신뢰할 수 없습니다.
while ! ping -W 1 -c 1 8.8.8.8 >&/dev/null; do sleep 600; done
Ping이 항상 인터넷 연결을 확인하는 가장 좋은 방법은 아닙니다. 많은 장소, 특히 기업 네트워크에서는 웹 액세스를 제외한 모든 액세스를 차단합니다. 고가용성 서버에서 파일을 다운로드하여 네트워크가 제대로 작동하는지 테스트할 수 있습니다. 이는 또한 적어도 HTTP 프록시의 관점에서 DNS를 테스트합니다(종종 중요함).
while ! wget -q -O /dev/null --no-cache http://www.google.com/; do sleep 6000; done
답변2
위의 방법 중 일부에는 몇 가지 결함이 있으며 왜 포괄적인 "인터넷이 작동하고 있습니까?"를 한 문장으로 완료할 수 없는 이유는 다음과 같습니다.
핑을 시도하기 전에 항상 링크가 활성화되어 있는지 확인해야 합니다. 이더넷 포트에 케이블이 연결되어 있지 않거나 멍청한 고양이가 전선을 씹어먹고 있다면 아무 것도 작동하지 않습니다.
먼저 localhost를 테스트해야 합니다. 이렇게 하면 TCP/IP 스택의 무결성이 확인됩니다.
DNS 서버에 연결할 수 없거나 차단된 경우 도메인 이름을 지정하여 DNS 확인에 의존하지 못할 수 있습니다. 선호하는 DNS 서버가 다운되었다고 해서 인터넷을 통해 다른 호스트에 연결할 수 없다는 의미는 아닙니다.
자신에게 속하지 않은 서버의 연결을 확인하기 위해 항상 동일한 주소나 호스트를 사용하는 것은 좋지 않습니다. 항상 사용 가능한 것으로 알려진 다양한/무작위 호스트 집합에 대해 테스트해야 하며, 가급적 네트워크 외부에 있는 자신이 소유한 호스트를 대상으로 테스트해야 합니다.
"인터넷"이 제대로 작동하는지 실제로 확인하려면 다양한 프로토콜을 사용해야 한다고 말하고 싶습니다. 네트워크의 좀비 컴퓨터가 DDoS의 일부로 많은 핑을 보내고 ISP가 ICMP를 차단할 수도 있습니다.
정말로 단방향 접근 방식을 취해야 한다면, 제가 할 일은 google.com이나 여러분이 선택한 다른 잘 알려진 인터넷 사이트로의 경로를 추적하는 것입니다. 한번 만. 트래픽이 서비스 제공업체의 네트워크를 떠나기 전에 얼마나 많은 홉을 거쳐야 하는지 이해하세요. 그런 다음 Traceroute를 사용하여 외부 연결을 테스트할 수 있지만 홉 수는 제한됩니다. Traceroute의 최종 Ping이 성공하면 네트워크를 종료할 수 있습니다. HTTP 등과 같은 다른 프로토콜에 대해 "traceroute와 유사한" 유틸리티를 갖고 싶습니다.
답변3
쉘에서 while 루프를 사용할 수 있습니다.
while true; do
if ping -W 1 -c 4 www.google.com >& /dev/null &&
ping -W 1 -c 4 www.yahoo.com >& /dev/null; then
break
fi
sleep 600
done
/bin/true
and 명령은 test 0
항상 0(true)을 반환하지만 true
항상 내장 명령이 아닐 수도 있습니다.
답변4
논리를 좀 더 명확하게 하기 위해 다음과 같이 서브셸에 수표를 작성할 수 있습니다.
while ! ( ping -W 1 -c 4 www.google.com >& /dev/null &&
ping -W 1 -c 4 www.yahoo.com >& /dev/null ); do
sleep 600
done
또는 함수에 테스트를 작성하세요.
can_ping_internet() {
ping -W 1 -c 4 www.google.com && ping -W 1 -c 4 www.yahoo.com
}
while ! can_ping_internet; do
sleep 600
done