ネットワーク情報の確認
8080 番には、すでに誰かが座っている
アプリを起動したら address already in use で落ちた、という場面はよくあります。前回のプロセスが生き残っているのか、別のツールが同じ番号を使っているのか、画面からは分かりません。
こういうときに使うのが ss です。いまサーバーとして待ち受けているポートと、それを掴んでいるプロセスを一息で出してくれます。
ターミナル
ss -tlnp
# Netid State Local Address:Port Process
# tcp LISTEN 0.0.0.0:8080 users:(("node",pid=1234,fd=20))
# tcp LISTEN 0.0.0.0:22 users:(("sshd",pid=789,fd=3))8080 の行に node と pid=1234 が出ています。犯人はこれです。あとは番号を控えて終了させれば、ポートが空きます。
付けている 4 文字にはそれぞれ意味があります。
| 文字 | 意味 |
|---|---|
-t | TCP だけを見る |
-l | 待ち受け中のものだけを見る |
-n | 名前に直さず番号のまま出す |
-p | 掴んでいるプロセスを出す |
番号が分かっているなら、1 行に絞れます。
ターミナル
ss -tlnp | grep 8080-p はプロセス名を出すために管理者権限が要ることがあるので、空欄なら sudo を付けて打ち直してください。
待ち受けてはいるが、外から入れない
ss で 0.0.0.0:8080 と出ていれば、どの経路からの接続も受け付けます。ところが 127.0.0.1:8080 と出ている場合は、そのマシンの中からしか繋がりません。ローカルでは動くのに同僚から見えない、という相談の多くはこれです。アプリ側の待ち受けアドレス設定を直す話であって、ファイアウォールをいじる話ではありません。
自分の IP が分からないと、繋いでもらえない
逆に「そちらの IP を教えてください」と言われる側になることもあります。ネットワークカードと、そこに割り当てられたアドレスを見るのが ip です。
ターミナル
ip a show eth0
# 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500
# inet 10.0.0.5/24 scope global eth0inet で始まる行が IPv4 のアドレスです。/24 はネットワークの区切りを表す表記で、この場合 10.0.0.x が同じ区画にいます。UP が付いていなければ、そのカードはそもそも無効です。
カード名は環境で変わります。クラウドの仮想マシンでは ens3 や enp0s3 のこともあるので、名前を指定せずに一覧を出してから絞り込むのが確実です。
古い記事では ifconfig や netstat が出てきますが、いまの Linux では標準で入っていないことが多く、ip と ss に置き換わっています。読むぶんには構いませんが、自分が打つときは新しい方を使ってください。
課題
- ip -o addr show lo を使う
- 出力に lo が含まれるか確認する
- 出力に inet が含まれるか確認する