Bash에서 에코 응답을 if 문 카운터 요청으로 변환하는 방법은 무엇입니까?

Bash에서 에코 응답을 if 문 카운터 요청으로 변환하는 방법은 무엇입니까?

if 문에서 ping 명령을 사용하려고 합니다. get go에서 시작하여 특정 수의 요청이 전송됩니다. 예를 들어 ping -c 6 hostname이러한 패킷의 어설션은 성공적인 것으로 간주됩니다 if [ $result -gt 4].안에손실이 있는 링크예를 들어, 다시 돌아오도록 하세요.

어느 정도 알아냈지만 각 명령( ping -c 1 hostname)에 대해 별도의 패킷을 보내는 것뿐입니다. 이는 시간이 더 오래 걸리고 연결 상태를 잘 반영하지 않습니다. 제가 정말 흥미로웠던 점 중 하나는 파이프를 사용하여 단어를 정수로 grep계산할 wc수 있었지만 그렇게까지 진행되지는 않았고 불행하게도 단일 패킷 테스트에만 초점을 맞추었다는 것입니다.

파일에 쓰는 것은 또 다른 방법이지만 다음 루프(모두 루프에 포함됨)에서 덮어쓰여 실제로 커지지 않더라도 쓰고 싶지 않습니다.

내가 원하는 것은 파일 서버가 사용 가능한지 테스트하는 것입니다. 그렇다면 설치하고, 그렇지 않으면 설치하지 마십시오.그리고시스템이 중단되거나 터널이 열리지 않도록 가능한 한 빨리 손실된 공유를 마운트 해제하십시오. AppleScript를 사용하여 automountd이 작업을 수행했지만 autofs유일한 스크립트 언어인 Bash 스크립트 bc[1.]를 사용하겠습니다.약간네트워크로 다시 전환할 때 빠르게 연결할 수 있는 여유가 있거나 네트워크에서 전환할 때 시스템이 중단되는 것을 방지할 수 있도록 작은 패킷 배치에서 신속하고 지속적으로 테스트하는 방법을 이해하고 [2.]

더 나은 방법이 있더라도 grep단일 명령에서 ped 행을 변환하여 양자화하고 if 문에서 사용하는 방법을 배우고 싶습니다.

감사해요!

답변1

6개 패킷 중 최소 4개 패킷이 수신되었는지 테스트하려고 합니다. 즉, 패킷 손실은 엄격하게 50% 미만입니다(수신된 6개 패킷 중 3개는 50% 손실을 의미함).

if ping -c 6 "$server" | awk -F, '/packet loss/ { exit !((0+$3) < 50) }'
then
    printf 'Server "%s" is alive and returning more than 50%% of packets\n' "$server"
else
    printf 'Server "%s" is in bad shape\n' "$server"
fi

awk이 명령은 출력에서 ​​텍스트가 포함된 줄을 살펴봅니다 . 줄의 세 번째 쉼표로 구분된 필드에는 패킷 손실 비율이라는 숫자가 있습니다. 이 숫자는 산술적 맥락에서 필드를 해석하여(0을 추가하여) 얻습니다. 코드를 종료하면 해당 상태는 패킷 손실이 50% 미만인지 여부를 반영합니다(0 = 예, 0이 아닌 = 아니요).packet losspingawk

답변2

이를 사용하여 awk성공적인 응답 수를 계산합니다.

if ping -c6 "$server" | awk '/bytes from/ { k++ } END { exit !(k>=4) }'
then
    echo OK
else
    echo Dubious
fi

일치하는 각 줄은 bytes from카운터를 증가시킵니다 k. 종료 상태가 성공(0)인 경우에만k >= 4

관련 정보