특정 주소를 핑 (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 끝난