답변:
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"
약간 회로가 좋지만 루프를 취소하려면 트릭을 수행해야합니다.
ping
으로 핑을 포기하기 전에 10 초 정도 기다립니다. 이를 1 초로 줄이려면을 사용할 수 있습니다 -w1
.
-W1
kill %1
죽이십시오.
루프를 수행하고 하나의 핑을 보내고 상태에 따라 루프를 끊을 수 있습니다 (예 : bash).
while true; do ping -c1 www.google.com > /dev/null && break; done
www.google.com
핑이 가능할 때까지 스크립트의 어딘가에 넣으면 차단됩니다 .
while true
과는 break
IMO, 청소기 솔루션입니다.
while true; do sleep 5; ping ...
나는 질문이 오래되었다는 것을 알고 있습니다. 특히에 대해 묻지 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
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
BSD 핑에서 SIGINT를 잘 처리합니다.
HOST=google.com NO=1; while [ $NO -ne 0 ]; do ping -W1 -c1 $HOST &>/dev/null; NO=$?;echo "$(date) ($HOST) $NO" ; done; echo "$(date) ($HOST) reachable"
기능으로서
ping_until(){
local NO=1
while [ $NO -ne 0 ]; do
ping -W1 -c1 $1 &>/dev/null; NO=$?
# Optionally block ICMP flooding
# sleep 1
echo "$(date) ($1) ($NO)"
done
}
다음 기능을 사용하고 있습니다. 잠시 후 시도를 중단하도록 지시 할 수 있기 때문에 좋아합니다.
#!/usr/bin/env bash
function networkup {
# Initialize number of attempts
reachable=$1
while [ $reachable -ne 0 ]; do
# Ping supplied host
ping -q -c 1 -W 1 "$2" > /dev/null 2>&1
# Check return code
if [ $? -eq 0 ]; then
# Success, we can exit with the right return code
echo 0
return
fi
# Network down, decrement counter and try again
let reachable-=1
# Sleep for one second
sleep 1
done
# Network down, number of attempts exhausted, quiting
echo 1
}
다음과 같이 사용하여 무언가를 시작할 수 있습니다.
# Start-up a web browser, if network is up
if [ $(networkup 60 www.google.com) -eq 0 ]; then
firefox &
fi