Linuxのpingコマンドの出力結果にタイムスタンプを付与する
Pocket

Linuxでpingコマンドを打ち続けていると、どの時間帯では疎通が取れていたのに、この時間帯からは疎通が取れなくなった、というような情報が欲しい事がある。
だが、残念ながら現時点ではpingのオプションにタイムスタンプを追記するような機能は無い。。。というと嘘になって、「-D」というオプションがあるにはあるんだけど。。。UNIX時刻で表示するようなのだ。

[root@localhost ~]# ping -D 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[1451860419.746687] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=5.20 ms
[1451860420.748230] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=5.36 ms
[1451860421.761398] 64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=16.9 ms
[1451860422.751211] 64 bytes from 8.8.8.8: icmp_seq=4 ttl=54 time=5.67 ms
[1451860423.755277] 64 bytes from 8.8.8.8: icmp_seq=5 ttl=54 time=7.93 ms
[1451860424.757697] 64 bytes from 8.8.8.8: icmp_seq=6 ttl=54 time=9.29 ms
[1451860425.755846] 64 bytes from 8.8.8.8: icmp_seq=7 ttl=54 time=6.05 ms
[1451860426.758742] 64 bytes from 8.8.8.8: icmp_seq=8 ttl=54 time=7.70 ms
[1451860427.763093] 64 bytes from 8.8.8.8: icmp_seq=9 ttl=54 time=10.2 ms
[1451860428.760407] 64 bytes from 8.8.8.8: icmp_seq=10 ttl=54 time=6.18 ms
[1451860429.761970] 64 bytes from 8.8.8.8: icmp_seq=11 ttl=54 time=6.42 ms
[1451860430.763397] 64 bytes from 8.8.8.8: icmp_seq=12 ttl=54 time=6.29 ms

 

では、どうやってタイムスタンプを付与するのかというと、もうこのオプションには頼らず、dateコマンドと組み合わせてwhileで実行させる。

ping 対象ホスト | while read pi; do echo "$(date '+[%Y/%m/%d %H:%M:%S]') $pi"; done

20160103_000017

[root@localhost ~]# ping 8.8.8.8 | while read pi; do echo "$(date '+[%Y/%m/%d %H:%M:%S]') $pi"; done
[2016/01/04 07:37:33] PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
[2016/01/04 07:37:33] 64 bytes from 8.8.8.8: icmp_seq=1 ttl=54 time=6.44 ms
[2016/01/04 07:37:34] 64 bytes from 8.8.8.8: icmp_seq=2 ttl=54 time=6.06 ms
[2016/01/04 07:37:35] 64 bytes from 8.8.8.8: icmp_seq=3 ttl=54 time=7.00 ms
[2016/01/04 07:37:36] 64 bytes from 8.8.8.8: icmp_seq=4 ttl=54 time=7.75 ms
[2016/01/04 07:37:37] 64 bytes from 8.8.8.8: icmp_seq=5 ttl=54 time=13.0 ms
[2016/01/04 07:37:38] 64 bytes from 8.8.8.8: icmp_seq=6 ttl=54 time=4.65 ms
[2016/01/04 07:37:39] 64 bytes from 8.8.8.8: icmp_seq=7 ttl=54 time=5.12 ms
Sponsored Links

xargsを用いる方法もある。

ping 8.8.8.8 | xargs -L 1 -I '{}' date '+[%Y/%m/%d %H:%M:%S] {}'

 

perlを用いる手法もあるようだ。

ping 8.8.8.8 | perl -MPOSIX -ne 'print strftime("%c ", localtime), $_'

 

とりあえず、いくつか方法はあるようなので、好きなので対応すると良いだろう。
そもそも、こんなことしなくても「-D」以外のオプションで人間の読める時間を出すようにしてもらえれば話は解決する気がするけど、まぁそのうち実装されるのだろう。

Pocket

Written by blacknon

インフラ系のSE。一時期はプログラマ。 仮想化とオープンソースに興味あり。一日中寝てたい今日このごろ。 スペインとかで働きたいなぁ…(シエスタがあるので)

Leave a Comment

メールアドレスが公開されることはありません。