답변:
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
사용법은 다음과 같습니다.
내가 찾은 가장 좋은 것은 -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.
ping
; 버전에 의존하는 것으로 보입니다 . Debian Wheezy ping: invalid option -- 'O'
에서는 " "가 표시되지만 Jessie에서는 참고 한대로 작동합니다. 이 정보를 포함하도록 답변을 업데이트 할 수 있습니다. (또한 출력에 사전 형식화 된 텍스트를 사용하고 맨 페이지의 정보를 사용하도록 제안 된 편집을 제출했습니다)
일반인 ping
이 그렇게 할 방법이 없습니다 . 스크립트를 작성하려는 경우 몇 가지 옵션이 있습니다.
ping -c 2 <ip>
RESULT=$?
echo $RESULT
1
핑이 실패하면 $?
1이되고 핑이 성공 $?
하면 0이됩니다.
다른 옵션은 fping
Cisco와 많이 작동합니다 ping
.
$ fping 200.1.1.1
200.1.1.1 is unreachable
$ fping 192.168.1.1
192.168.1.1 is alive
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는 범위를 훨씬 초과합니다.
나는 두려워하지만 표준 핑을 사용하는 것에 대한 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 을 사용하는 것 입니다.
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
좋았고 BTW는 또는 추가 -e
할 때 필요하지 않으며 그냥 사용할 수 있으며 출력은 동일합니다. -l
-c
fping -l 8.8.8.8
스크립팅없이
ping -f -i 1 hostname
장점 : 표준 Linux 명령-설치하거나 스크립트 할 필요가 없습니다.
단점 :
최소한의 스크립트로
#!/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 가지 핑 옵션을 사용할 수 없습니다.
-i
패킷 전송 간격을 변경 (1 초로 하드 코딩 됨)-W
타임 아웃을 변경하려면 (1 초로 하드 코딩 됨)-c
N 패킷을 보낸 후 중지BTW : 이것은 Linux CLI 도구에서 실제로 놓친 기능 중 매우 드문 예 중 하나이지만 Windows 도구에서는 찾을 수 있습니다. 그들이 말하는대로 규칙을 증명하는 실행 :-)
윈도우와 마찬가지로 타임 스탬프를 사용하여 연속 핑을 수행하려면이 것을 사용하십시오. 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 ~]$