「長いping」のみを出力/接続中断をログに記録

「長いping」のみを出力/接続中断をログに記録

時々接続が中断されることがあります。 を使用するとping、次のような出力が生成されます。

64 bytes from 192.168.0.1: icmp_req=1196 ttl=64 time=4.64 ms
64 bytes from 192.168.0.1: icmp_req=1197 ttl=64 time=5.14 ms
64 bytes from 192.168.0.1: icmp_req=1198 ttl=64 time=4.90 ms
64 bytes from 192.168.0.1: icmp_req=1199 ttl=64 time=25293 ms < -- interruption
64 bytes from 192.168.0.1: icmp_req=1200 ttl=64 time=24286 ms      starts here
64 bytes from 192.168.0.1: icmp_req=1201 ttl=64 time=23278 ms
64 bytes from 192.168.0.1: icmp_req=1202 ttl=64 time=22270 ms
64 bytes from 192.168.0.1: icmp_req=1203 ttl=64 time=21262 ms
64 bytes from 192.168.0.1: icmp_req=1204 ttl=64 time=20254 ms
64 bytes from 192.168.0.1: icmp_req=1224 ttl=64 time=142 ms
64 bytes from 192.168.0.1: icmp_req=1225 ttl=64 time=4.87 ms
64 bytes from 192.168.0.1: icmp_req=1226 ttl=64 time=4.54 ms

どうやって?

  • が大きい行だけを出力しますtime。できgrepますか?
  • タイムスタンプを追加します(-Dのオプションについては知っていますpingが、人間が読めるスタンプの方が好みです)

答え1

この解決策はgrepawkこの質問から抜粋、やりすぎかもしれないが、効果はある)

ping 192.168.0.1 \
| grep -E "time=[0-9]{2}" --line-buffered \
| gawk '{ print strftime("%Y-%m-%d %H:%M:%S"), $0; fflush(); }'

答え2

過剰な解決策といえば、最初の質問 (X より大きい時間の行のみを取得する) に対する回答がまだ必要な場合は、次の醜い bash-python ハイブリッド スクリプトを試してください。

#!/bin/bash

IFS='\n' read -r -d '' check_ping <<EOF
from sys import stdin
data = reduce(lambda x, y: str(x) + str(y), stdin.readlines())
time = int(float(data.split("time=")[-1].split(" ")[0].strip()))
if time > $2: print(data)
EOF

ping -c 1 $1 | python -c "${check_ping}"

これをスクリプト ファイル (たとえば ) に配置すると、test.sh2 つのパラメータ (ping するホスト名と、ping 出力をエコーし​​ない最小 TTL) を渡すことができます。たとえば、 を実行すると、tst.sh www.google.com 100100 ミリ秒以上かかる www.google.com への ping のみが返されます。

答え3

この種の処理でテキストを処理するのは、UNIX らしいやり方ではありますが、あまり好きではありません。perl と Net::Ping を検討してみてはいかがでしょうか。これを使用すると、独自のタイムアウトを定義して、ping が失敗した場合にのみアクションを実行できます。詳細はこちら:

http://perldoc.perl.org/Net/Ping.html

関連情報