Linux Ping : 시간 초과 표시


17

출력을 생략하지 않고 요청에 '시간 초과'를 표시하도록 Linux 핑을 만들려면 어떻게해야합니까?

Windows 버전의 핑과 같습니다.


당신은 어떻게 할 수 없습니다 제한 시간을 보여?
Michael

답변:


12

fping이 저에게 효과가 없었습니다 ... 제 경우에는 이것이 기본적으로 서버 재부팅 중임을 알기 원합니다 ... 이것은 Windows에서 꽤 잘 작동합니다 ...

이 질문에 도움이되는 간단한 스크립트 (@entropo 답변 확장)를 작성하면이 질문에 대답하는 데 도움이 될 수 있습니다.

https://gist.github.com/brunobraga/7259197

#!/bin/bash

host=$1

if [ -z $host ]; then
    echo "Usage: `basename $0` [HOST]"
    exit 1
fi

while :; do
    result=`ping -W 1 -c 1 $host | grep 'bytes from '`
    if [ $? -gt 0 ]; then
        echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;31mdown\033[0m"
    else
         echo -e "`date +'%Y/%m/%d %H:%M:%S'` - host $host is \033[0;32mok\033[0m -`echo $result | cut -d ':' -f 2`"
        sleep 1 # avoid ping rain
    fi
done

사용법은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오


패킷 손실 백분율을보고하고 모든 라인에서 계산하도록 수정 하시겠습니까?
Pol Hallen

21

내가 찾은 가장 좋은 것은 -O 플래그를 사용하는 것입니다 (Linux Mint 17.1 Rebecca IPUTILS-PING 3 : 20121221-4ubuntu1.1 사용-모든 배포판에서 작동하지는 않습니다)

$ ping -O 10.10.5.1

64 bytes from 10.10.5.1: icmp_seq=53 ttl=245 time=460 ms
no answer yet for icmp_seq=54
64 bytes from 10.10.5.1: icmp_seq=55 ttl=245 time=265 ms
64 bytes from 10.10.5.1: icmp_seq=56 ttl=245 time=480 ms
no answer yet for icmp_seq=57
64 bytes from 10.10.5.1: icmp_seq=58 ttl=245 time=348 ms
64 bytes from 10.10.5.1: icmp_seq=59 ttl=245 time=515 ms
no answer yet for icmp_seq=60
64 bytes from 10.10.5.1: icmp_seq=61 ttl=245 time=320 ms
64 bytes from 10.10.5.1: icmp_seq=62 ttl=245 time=537 ms

매뉴얼 페이지에서 :

-O Report outstanding ICMP ECHO reply before sending next packet. This is useful together with the timestamp -D to log output to a diagnostic file and search for missing answers.


안녕하세요 scoy, 슈퍼 유저에 오신 것을 환영합니다.이 질문에 대한 답변 감사합니다! 이것은 ping; 버전에 의존하는 것으로 보입니다 . Debian Wheezy ping: invalid option -- 'O'에서는 " "가 표시되지만 Jessie에서는 참고 한대로 작동합니다. 이 정보를 포함하도록 답변을 업데이트 할 수 있습니다. (또한 출력에 사전 형식화 된 텍스트를 사용하고 맨 페이지의 정보를 사용하도록 제안 된 편집을 제출했습니다)
bertieb

5

ping을 사용하여 호스트가 쉘 스크립트에 있는지 확인하면 다음과 같이합니다.

ping -W 1 -c 1 $HOST 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-host-to-be-up

기본적으로 하나의 ICMP를 출력없이 1 초 안에 종료하고 종료 코드를 사용하여 추가 조치를 게이트합니다.


2

일반인 ping이 그렇게 할 방법이 없습니다 . 스크립트를 작성하려는 경우 몇 가지 옵션이 있습니다.

ping -c 2 <ip>
RESULT=$?
echo $RESULT
1

핑이 실패하면 $?1이되고 핑이 성공 $?하면 0이됩니다.

다른 옵션은 fpingCisco와 많이 작동합니다 ping.

$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive

2

bruno.braga의 위의 스크립트는 정상적으로 작동하지만 개인적으로 쉘 프로파일 (.bashrc와 같은)에서 별칭을 사용하여 매일 사용하는 것이 좋습니다.

아래의 솔루션은 ECHO 요청 시퀀스 번호를 자동으로 계산합니다.

alias pingt='__pingt() { s=0; while :; do s=$(($s+1)); result=$(ping $1 -c1 -W1 |/bin/grep from) && echo "$result, seq=$s" && sleep 1 || echo timeout; done }; __pingt $1'

다음은 호스트가 시간 초과로 불안정한 경우의 출력 예입니다.

$ pingt 10.10.10.126
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.235 ms, seq=1
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.228 ms, seq=2
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.209 ms, seq=3
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.241 ms, seq=4
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.195 ms, seq=5
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.211 ms, seq=6
timeout
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.267 ms, seq=8
64 bytes from 10.10.10.126: icmp_req=1 ttl=64 time=0.232 ms, seq=9
^C

물론 단점은 CTRL-C를 눌렀을 때 통계가 없다는 것입니다. 원하는 경우 쉘 스크립트로 min / avg / max를 계산할 수도 있습니다. mdev는 범위를 훨씬 초과합니다.


1

나는 두려워하지만 표준 핑을 사용하는 것에 대한 100 % 해결책은 없습니다. 상세 출력 핑에 대해 ping -v 를 사용 하더라도 시간 초과의 경우 자동으로 작동합니다. 당신은 사용하려고 할 수 있습니다 :

ping -w 2 192.168.199.1
PING 192.168.199.1 (192.168.199.1) 56(84) bytes of data.

--- 192.168.199.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1007ms

그러면 2 초 후에 핑이 중지되고 전송 된 패킷 수와 패킷 손실이 표시됩니다. 또 다른 옵션은 mtr 을 사용하는 것 입니다.


1
nomad@local:~$ fping -l -e 8.8.8.8

8.8.8.8 : [0], 92 bytes, 183 ms (183 avg, 0% loss)
8.8.8.8 : [1], 92 bytes, 61.4 ms (122 avg, 0% loss)
8.8.8.8 : [2], 92 bytes, 164 ms (136 avg, 0% loss)
8.8.8.8 : [3], 92 bytes, 163 ms (143 avg, 0% loss)
8.8.8.8 : [5], 92 bytes, 158 ms (146 avg, 16% loss)
8.8.8.8 : [6], 92 bytes, 122 ms (142 avg, 14% loss)
8.8.8.8 : [7], 92 bytes, 134 ms (141 avg, 12% loss)
8.8.8.8 : [8], 92 bytes, 130 ms (140 avg, 11% loss)

nomad@local:~$ fping -version
fping: Version 3.2
fping: comments to david@schweikert.ch

그러나 fping을 몇 분 동안 실행 한 후 산발적 인 시간 초과는 인쇄 손실에 영향을주지 않습니다 (1000 개 중 1 개의 패킷은 0.1 % 손실이며 fping은 0 % 인쇄를 계속합니다). 18 %가 19 %로 바뀌는 시간을 잡는 것보다 "요청 시간 초과"를 인식하는 것이 훨씬 쉽다는 것은 말할 것도없고, 18 %가 17 %로 돌아가는 순간을 무시할 필요는 없습니다.
ndemou

fping좋았고 BTW는 또는 추가 -e할 때 필요하지 않으며 그냥 사용할 수 있으며 출력은 동일합니다. -l-cfping -l 8.8.8.8
Eric Wang

0

Bruno의 쉘 스크립트가 정말 마음에 듭니다. 모든 실패가 포함 된 파일을 작성하는 행을 추가했습니다.

echo -e " date +'%Y/%m/%d %H:%M:%S'-호스트 $ host는 \ 033 [0; 31mdown \ 033 [0m">> ./lostpackets.txt입니다.


0

스크립팅없이

ping -f -i 1 hostname

장점 : 표준 Linux 명령-설치하거나 스크립트 할 필요가 없습니다.

단점 :

  1. 성공적으로 응답 한 패킷에 대해 NOTHING이 인쇄됩니다.
  2. 성공적으로 응답 한 패킷에 대해 성가신 경고음을냅니다.
  3. 시간 초과의 시각적 표시는 가능한 최소입니다 (패킷이 시간 초과 될 때 작은 점이 화면에 유지됨).

최소한의 스크립트로

#!/bin/bash
while :; do
    ping -W1 -c 1 "$@" | grep 'bytes from '
    case $? in
        0 ) sleep 1 ;;
        1 ) echo -e "request timeout" ;;
        * ) exit ;;
    esac
done

단점 : 마지막에는 통계가 없으며 다음 3 가지 핑 옵션을 사용할 수 없습니다.

  1. -i 패킷 전송 간격을 변경 (1 초로 하드 코딩 됨)
  2. -W 타임 아웃을 변경하려면 (1 초로 하드 코딩 됨)
  3. -c N 패킷을 보낸 후 중지

BTW : 이것은 Linux CLI 도구에서 실제로 놓친 기능 중 매우 드문 예 중 하나이지만 Windows 도구에서는 찾을 수 있습니다. 그들이 말하는대로 규칙을 증명하는 실행 :-)


0

윈도우와 마찬가지로 타임 스탬프를 사용하여 연속 핑을 수행하려면이 것을 사용하십시오. 192.168.0.1자신의 IP 주소로 자유롭게 교체 하십시오

while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done

답글 예

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.1 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:49 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:50 GMT 2018 >>> Reply OK
Wed Jan  3 03:41:51 GMT 2018 >>> Reply OK
^Z
[23]+  Stopped                 sleep 1
[user@Linux ~]$

요청 시간 초과

[user@Linux ~]$ while :; do ping -c 1 -t 1 192.168.0.254 > /dev/null && echo "`date` >>> Reply OK" && sleep 1 || echo "`date` >>> Request timed out"; done
Wed Jan  3 03:41:36 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:37 GMT 2018 >>> Request timed out
Wed Jan  3 03:41:38 GMT 2018 >>> Request timed out
^Z
[22]+  Stopped                 ping -c 1 -t 1 192.168.0.254 >/dev/null
[user@Linux ~]$ 

0

정상적인 Ping은 실제로 시간 초과를 표시합니다. ping 사이의 seq = 값을 보면 시간 초과 횟수를 알 수 있습니다

64 bytes from 192.168.12.46: icmp_seq=8 ttl=62 time=46.7 ms
64 bytes from 192.168.12.46: icmp_seq=11 ttl=62 time=45.3 ms

EG 3 시간 초과는 첫 번째 시간과 seq=8두 번째 seq=11시간 이후 (9와 10은 시간 초과) 이후 위의 두 핑 사이에서 발생했습니다 seq=sequence.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.