Linux pingを実行して、出力を省略せずにリクエストを「タイムアウト」にするにはどうすればよいですか?
Windowsバージョンのpingと同じです。
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
Manページから:
-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を使用してホストがシェルスクリプトで稼働しているかどうかを確認するとき、次のようにします。
ping -W 1 -c 1 $Host 2>&1 > /dev/null || (echo -n "dead!"; false) && command-that-needs-Host-to-be-up
基本的に、1秒でタイムアウトする1つのICMPを出力せずに送信し、終了コードを使用して以降のアクションを制御します。
一般的なping
がそれを行う方法はありません。スクリプトを作成しようとしている場合は、いくつかのオプションがあります。
ping -c 2 <ip>
RESULT=$?
echo $RESULT
1
Pingが失敗した場合、$?
は1になります。pingが成功した場合、$?
は0になります。
もう1つのオプションは、Cisco fping
とよく似た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はスコープをはるかに超えています。
申し訳ありませんが、標準のpingでは100%の解決策はありません。 ping -vを指定しても、詳細な出力の場合、pingはタイムアウトの場合はサイレントになります。あなたが使用しようとすることができます:
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秒後にpingを停止し、送信されたパケットの数とパケット損失を示します。別のオプションは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 [email protected]
私はブルーノのシェルスクリプトが本当に好きです。すべての失敗を含むファイルを作成する行を追加しました。
echo -e "date +'%Y/%m/%d %H:%M:%S'
-ホスト$ Hostは\ 033 [0; 31mdown\033 [0m ">> ./lostpackets.txt
通常の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
最初の1回がseq=8
で、2回目がseq=11
(9と10はタイムアウト)seq=sequence
だったため、上記の2つのpingの間にEG 3タイムアウトが発生しました。
ウィンドウと同じように、タイムスタンプを使用して継続的なpingを実行する場合は、これを使用します。交換してください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
返信例OK
[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 ~]$
何もスクリプトなしで
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つのpingオプションを使用できません。
-i
パケットの送信間隔を変更します(1秒にハードコードされています)-W
タイムアウトを変更する(1秒にハードコードされています)-c
Nパケット送信後に停止しますところで:これは、Linux CLIツールで本当に見逃している機能の非常にまれな例の1つですが、Windowsツールで見つかります。彼らが言うようにルールを証明する免除:-)