[server] 호스트가 알려질 때까지 리눅스에서 핑하는 방법?

특정 주소를 핑 (ping)하는 방법과 발견되면 핑 (ping)을 중지하십시오.

bash 스크립트에서 사용하고 싶습니다. 따라서 호스트가 시작될 때 스크립트는 핑을 유지하고 호스트가 사용 가능한 순간부터 스크립트가 계속됩니다 …



답변

Martynas의 답변을 더 단순화 :

until ping -c1 www.google.com >/dev/null 2>&1; do :; done

핑 자체는 루프 테스트로 사용됩니다. 성공하자마자 루프가 종료됩니다. :구문 오류를 방지하기 위해 널 명령 ” “을 사용하여 루프 본문이 비어 있습니다.

업데이트 : Control-C가 ping 루프를 깨끗하게 종료하는 방법을 생각했습니다. 백그라운드에서 루프를 실행하고 인터럽트 (Control-C) 신호를 포착하고 백그라운드 루프가 발생하면 종료합니다.

ping_cancelled=false    # Keep track of whether the loop was cancelled, or succeeded
until ping -c1 "$1" >/dev/null 2>&1; do :; done &    # The "&" backgrounds it
trap "kill $!; ping_cancelled=true" SIGINT
wait $!          # Wait for the loop to exit, one way or another
trap - SIGINT    # Remove the trap, now we're done with it
echo "Done pinging, cancelled=$ping_cancelled"

약간 회로가 좋지만 루프를 취소하려면 트릭을 수행해야합니다.


답변

루프를 수행하고 하나의 핑을 보내고 상태에 따라 루프를 끊을 수 있습니다 (예 : bash).

while true; do ping -c1 www.google.com > /dev/null && break; done

www.google.com핑이 가능할 때까지 스크립트의 어딘가에 넣으면 차단됩니다 .


답변

나는 질문이 오래되었다는 것을 알고 있습니다. 특히에 대해 묻지 ping만 솔루션을 공유하고 싶었습니다.

호스트를 재부팅 할 때 SSH를 다시 ​​연결할 수있는 시점을 알 때 사용합니다. ( 시작 ping하기 전에 몇 초 동안 응답합니다 sshd.)

until nc -vzw 2 $host 22; do sleep 2; done


답변

대상 호스트를 한 번 핑하십시오. Ping에 성공했는지 확인하십시오 (Ping의 반환 값이 0 임). 호스트가 활성 상태가 아닌 경우 다시 핑하십시오.

다음 코드는 파일로 저장하고 호스트 이름을 인수로 사용하여 호출하거나 첫 번째 및 마지막 행을 제거하여 기존 스크립트 (waitForHost 호스트 이름) 내에서 함수로 사용할 수 있습니다.

핑이 응답하지 않으면 코드는 실패 원인을 평가하지 않으므로 호스트가 존재하지 않으면 영원히 반복됩니다. 내 BSD 맨 페이지에는 각 반환 값의 의미가 나열되어 있지만 Linux는 그렇지 않으므로 이식성이 없을 수도 있으므로 생략했습니다.

#!/bin/bash

PING=`which ping`

function waitForHost
{
    if [ -n "$1" ];
    then
        waitForHost1 $1;
    else
        echo "waitForHost: Hostname argument expected"
    fi
}

function waitForHost1
{
    reachable=0;
    while [ $reachable -eq 0 ];
    do
    $PING -q -c 1 $1
    if [ "$?" -eq 0 ];
    then
        reachable=1
    fi
    done
    sleep 5
}
waitForHost $1


답변

UNREACHEABLE=1;
while [ $UNREACHEABLE -ne "0" ];
   do ping -q -c 1 HOST &> /dev/null; UNREACHEABLE=$?; sleep 1;
done

수면 1을 제거 할 수 있습니다. 호스트에 도달 할 수 있지만 핑이 코드 0으로 종료되지 않는 경우 홍수 문제를 방지하기 위해 여기에 있습니다.


답변

stackoverflow 에서 좋은 옵션을 참조하십시오 . 다음은 bash의 샘플입니다. 성공적인 ping 결과를 반환 할 때까지 다음 코드를 반복해야합니다.


ping -c 1 -t 1 192.168.1.1;
if [ $? -eq 0 ]; then
    echo "192.168.1.1 is up";
else
    echo "ip is down";
fi


답변

위의 루프 중 하나를 ping 대신 fping과 함께 사용할 수 있습니다. IMO는 ping 자체보다 스크립트에 사용하기에 더 적합합니다. 자세한 내용은 fping (1) 을 참조하십시오.

while ! fping -q $HOSTNAMES ; do :; done

또한 기계가 작동하기 전에 기계가 작동 중인지 테스트하는 데 유용합니다. 간단한 예 :

HOST1에서 h 동안 HOST2 HOST3; 하다
  fping -q $ h이면; 그때
     echo -n "$ h :"
     ssh $ h "uname -a"
  fi
끝난