UNIX/Linuxの部屋 コマンド:ping

TOP UNIX/Linuxの部屋 UNIX/Linuxコマンド一覧 用語集 新版 由来/読み方辞書 環境変数マニュアル Cシェル変数 システム設定ファイル システムコール・ライブラリ ネットワークプログラミングの基礎知識 クラウドサービス徹底比較・徹底解説




コマンド ping 指定サーバ・ホストにパケットを送信して到達性や遅延を確認する このエントリーをはてなブックマークに追加

最終更新


UNIX/Linux の ping コマンドは、指定されたホスト名や IP アドレスに対してパケットを送信し、その返信が到達したら表示することで、疎通確認や遅延確認を行うことができるコマンドである。


ping コマンドの基本的な使い方
ping コマンドの使い方は下記のとおりである。
% ping [ホスト名]
または
% ping [IPアドレス]

ping コマンドは相手先に ICMP echo というパケットを送信する。それに対して相手先が ICMP echo reply という応答パケットを送り返してくる。

BSD や Linux の ping は、(応答があろうとなかろうと) 1秒おきに ICMP echo を送信し続け、ICMP echo reply が届くたびに往復時間などの情報を表示する。
% ping www.jp.freebsd.org
PING www.jp.freebsd.org (211.14.6.244): 56 data bytes
64 bytes from 211.14.6.244: icmp_seq=0 ttl=51 time=17.334 ms
64 bytes from 211.14.6.244: icmp_seq=1 ttl=51 time=16.747 ms
64 bytes from 211.14.6.244: icmp_seq=2 ttl=51 time=17.144 ms
64 bytes from 211.14.6.244: icmp_seq=4 ttl=51 time=14.234 ms
^C
⇒ 永遠に送信と応答を続けるので、適当なところで Ctrl-c で中断する。すると以下のようなサマリが表示される。

--- www.jp.freebsd.org ping statistics ---
4 packets transmitted, 3 packets received, 25% packet loss
⇒ 4パケット送信し、そのうち3パケット分の応答を受信。25% のパケットが喪失した。
round-trip min/avg/max/stddev = 14.234/16.364/17.334/0.318 ms
⇒ 往復時間の最小は 14.234ミリ秒、平均は 16.364ミリ秒、最大は 17.334秒、分散は 0.318 であった
上記の例では、icmp_seq=3 に対する応答が届かなかったことに注目しよう。また、「time=... ms」の部分を見ることで往復時間 (RTT) の長さやばらつきを知ることができる。

Solaris の ping は、応答が返ってくると
% ping www.jp.freebsd.org
www.jp.freebsd.org is alive
というあっさりとした表示を出力してすぐに終了する。BSD や Linux のような挙動をさせるには -s オプションを指定する。

ping コマンドのオプション
-c 回数 パケットを送受信する回数を指定する。指定しない場合は永遠にパケットを送り続ける。
-o 応答パケットをひとつだけ送信したら、終了する。
-t 秒数 指定時間が経過したらタイムアウトする。BSD や Linux の ping のデフォルトは、タイムアウトなしである (永遠に送信しつづける)。Solaris の ping のデフォルトは 20秒。
-i 秒数 パケットを送信する間隔を指定する。デフォルトは 1秒。Solaris では -i ではなく -I オプションを使う。

シェルスクリプトでの ping による到達性確認
シェルスクリプトで特定のホストに到達できるかを調べるには、以下のようにするとよいだろう。
#!/bin/sh
host=www.exmaple.com
timeout=10
ping -t $timeout -o $host
if [ $? != 0 ]; then
echo "$host に接続できません (タイムアウトまでの秒数 $timeout)"
fi

トラブルシューティング
まず、ping を目的のマシンに打ってみる。
% ping www.example.com
ping: cannot resolve www.example.com: Unknown host
このエラーが出たときは、DNS サーバによる「ホスト名→IP アドレス」の変換がうまくいっていないということである。原因としては、
  • 相手側の DNS サーバが落ちている
  • こちら側の DNS サーバが落ちている
  • /etc/resolv.conf、/etc/hosts などの設定ミス
が考えられる。

もし www.example.com に対応する IP アドレスを知っているなら、直接 IP アドレスを指定してみる。
% ping 10.0.0.1
PING 10.0.0.1 (10.0.0.1): 56 data bytes
36 bytes from 127.0.1.1 (127.0.1.1): Destination Host Unreachable
Vr HL TOS  Len   ID Flg  off TTL Pro  cks      Src      Dst
 4  5  00 5400 051a   0 0000  f0  01 b735 133.8.2.77  10.0.0.1

最近は、ping が使用する ICMP echo をファイアウォールでフィルタリングしたり、OS が ICMP echo reply を送信しないよう設定するケースも増えている。例えば、www.yahoo.co.jp に ping を打っても、応答は返ってこない。

HowTo: ping コマンドの出力にタイムスタンプを表示するには 【2019-01-13追加】
ping コマンドの出力には年月日時分秒などのタイムスタンプが表示されないため、後からログを見返してもいつの記録なのかわかりづらい。

そこで、ping コマンド結果の各行先頭に日時を表示する例を紹介する。

sh・bash で:
% ping www.google.com | while read line; do echo `date` $line; done
Sun Jan 13 14:19:35 JST 2019 PING www.google.com (172.217.161.68): 56 data bytes
Sun Jan 13 14:19:35 JST 2019 64 bytes from 172.217.161.68: icmp_seq=0 ttl=55 time=1.253 ms
perl で:
% ping www.google.com | perl -ne 'print scalar(localtime), " ", $_'
Sun Jan 13 14:19:58 2019 PING www.google.com (172.217.31.132): 56 data bytes
Sun Jan 13 14:19:58 2019 64 bytes from 172.217.31.132: icmp_seq=0 ttl=55 time=1.614 ms
perl で (書式設定付き):
% ping www.google.com | perl -pe '$|=1;@x=localtime();$x=sprintf("%02d/%02d/%02d %02d:%02d:%02d: ",$x[5]+1900,$x[4]+1,$x[3],$x[2],$x[1],$x[0]); s/^/$x/;'
2019/01/13 14:20:26: PING www.google.com (172.217.26.36): 56 data bytes
2019/01/13 14:20:26: 64 bytes from 172.217.26.36: icmp_seq=0 ttl=55 time=1.486 ms
moreutil に含まれている ts コマンドで:
ping www.google.com | ts
Sun 13 14:20:26: PING www.google.com (172.217.26.36): 56 data bytes
Sun 13 14:20:26: 64 bytes from 172.217.26.36: icmp_seq=0 ttl=55 time=1.486 ms
moreutil に含まれている ts コマンドで (書式設定付き):
% ping www.google.com | ts '%F %T'
2019-01-13 14:20:26: PING www.google.com (172.217.26.36): 56 data bytes
2019-01-13 14:20:26: 64 bytes from 172.217.26.36: icmp_seq=0 ttl=55 time=1.486 ms

関連コマンド
到達性や遅延の確認には traceroute コマンドを使うこともある。

名前解決の問題であれば nslookup コマンドや dig コマンドを使う。
>> Linuxオンラインマニュアル(man) Linux ping(8)
>> FreeBSDオンラインマニュアル(man) FreeBSD ping(8)

読み方 ping (UNIXコマンド) [ぴん] [ぴんぐ] [ぴーいんぐ] このエントリーをはてなブックマークに追加

"Packet InterNet Groper" の略。しかし、これはたぶん後から考えたもので、本当は潜水艦のソナー音からきているのではないかと思われる。ネットワーク上で相手のマシンから反応が返ってくるかどうかを調べるコマンド。

[ぴんぐ] 派は「King Kong だってキングコングじゃないか」と言い、[ぴん] 派は「Ping Pong はピンポンで、Hong Kong はホンコンだろ」と言う。