深夜2時、静まり返ったNOC(ネットワークオペレーションセンター)のフロア。モニタの青白い光だけが、幾重にも重なるアラートの点滅を照らし出しています。「またか……」。インフラエンジニアなら誰もが一度は冷や汗をかいた経験があるでしょう。
「Webサーバーを再起動しようとしたのに、なぜか『Address already in use(すでに使われているアドレスです)』って怒られて起動しない!」
「テスト環境を立ち上げたいのに、謎のプログラムが邪魔をしてポートを占有している……!」
こんな時、あなたはどうしますか?「とりあえずサーバーを丸ごと再起動だ!」なんて力技に頼っていませんか?ちょっと待ってください。百戦錬磨のエンジニアなら、そんな野暮な真似はしません。私たちは、犯人をピンポイントで特定し、静かに、そして確実に排除するスマートな道具を持っています。
今回は、現代のLinuxインフラ運用において必須のスキルとなった ss コマンドを使った「リスニングポートとプロセスの紐付け」について、現場のリアルな知見を交えながら、とことん優しく紐解いていきたいと思います。
—
1. ポートとプロセスの関係を「郵便受けと住人」に例えてみよう
ネットワークの世界に初めて触れるとき、IPアドレスやポート番号という言葉に圧倒されてしまいますよね。でも、難しく考える必要は全くありません。身の回りの世界に置き換えて考えてみましょう。
サーバーを「大きなマンション」、IPアドレスを「マンションの住所」、そしてポート番号を「各部屋のポスト(郵便受け)」だとイメージしてください。
- IPアドレス: 「東京都〇〇区……」という建物全体の場所
- ポート番号: 「101号室」「205号室」といった個別の部屋番号
- プロセス(PID): その部屋に住んでいる「住人(プログラム)」
世の中にはたくさんのサービス(Webサーバーならポート80や443、データベースならポート3306など)があります。外から手紙(パケット)が届いたとき、郵便配達員はどの部屋のポストに入れればいいかを知るためにポート番号を見ます。
そして、今回のテーマである ss コマンドの -l と -p オプションの組み合わせは、いわば「今現在、どの部屋(ポート)の前に誰(どのプログラム)が張り付いて待ち構えているのか」をリスト化する名簿チェックのようなものです。「一体どいつがこの部屋を勝手に占有しているんだ?」という謎を瞬時に解き明かしてくれます。
—
2. なぜ今、netstat ではなく ss なのか?
少し前まで、こうした調査には netstat というコマンドがよく使われていました。「ネットスタット」と、今でも先輩たちが口癖のように言うのを聞いたことがあるかもしれません。
しかし、現代の巨大化・高速化したデータセンターやクラウド環境において、netstat はすっかりおじいちゃんになってしまいました。何万ものアクセスが押し寄せる高負荷なサーバーで netstat を叩くと、カーネルの情報を一生懸命かき集めるため、画面がフリーズしたかのように固まってしまうことがあります。
そこで登場したのが、今回主役となる ss(Socket Statistics)コマンドです。
ss はLinuxのカーネル内部の情報を直接、そして圧倒的なスピードで引き出します。どれだけトラフィックが多いサーバーであっても、一瞬で結果を返してくれる。まさに、私たちインフラエンジニアの頼れる相棒というわけです。
—
3. 実践!ss -lp で犯人(プロセス)を特定する
それでは、実際に黒い画面(端末)を開いて、その実力を体感してみましょう。一歩ずつ、確実に理解していきましょうね。
私たちが使いたいのは、次のコマンドです。
# すべてのリスニングソケット(待ち受け状態のポート)をプロセス情報付きで表示する
sudo ss -l -p
オプションの意味を分解してみましょう。
-l(Listening): 今まさに「通信が来るのを待っている(リスニング状態)」のポートだけを絞り込んで表示します。-p(Processes): そのポートを開いている「プログラムの名前」と「PID(プロセスID)」を表示します。
もちろん、これらをくっつけて ss -lp と省略して書いても全く同じ動きをします。現場のエンジニアはタイピングを速くするために、よくこの形を使います。
実際の出力結果を読んでみよう
実際にコマンドを叩くと、以下のようなずらっとした文字が画面に流れます(※分かりやすく一部を抜粋・整形しています)。
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=1234,fd=6))
LISTEN 0 128 *:22 *:* users:(("sshd",pid=856,fd=3))
おっ、見慣れない英単語や数字が出てきましたね。でも、恐れる必要はありません。左から順に解読していきましょう。
1. State (LISTEN): 「今か今かと待ち受けていますよ」という状態です。
2. Local Address:Port (0.0.0.0:80): このサーバーのすべてのIPアドレス (0.0.0.0) の、80番 ポート(通常のWeb通信用)で待ち受けているという意味です。
3. Process (users:(("nginx",pid=1234,fd=6))): ここが一番重要です!犯人の名前は nginx(Webサーバーのソフト)、PID(住民票の番号)は 1234 であることが一目瞭然で分かります。
これで、「あ、ポート80を使っていたのはPID 1234のnginxだな」と特定できました。
—
4. 現場で役立つ!さらに実用的なテクニック
実務の現場では、何百行もの膨大なリストが画面を流れ去っていくため、そのままでは目が回ってしまいます。ここからは、現場で即座に使える「実用的なフィルター術」をいくつかご紹介します。
特定のポート番号だけをピンポイントで調べる
「Webサーバーを起動したいのに、80番ポートが塞がっている」というピンチのときは、80番ポートに狙いを定めて調べましょう。sport(ソースポート)や dport というフィルターが使えます。
# 80番ポートを誰が使っているかピンポイントで調べる
sudo ss -lpt '( sport = :http )'
※ :http の代わりに :80 と書いても大丈夫です。
このコマンドを叩けば、余計な情報が表示されず、まさに「今、80番ポートにしがみついている厄介なやつ」だけが画面にポツンと表示されます。
なぜ sudo が必要なの?
ここで一つ、初心者が必ずと言っていいほどハマる罠についてお話しておきましょう。
「あれ、ss -lp を実行したのに、Process の欄が空っぽで何も表示されない……?」
これ、現場でも本当によくある質問です。原因はシンプルで、「権限不足」です。
Linuxの世界では、自分以外のユーザーが動かしている秘密のプログラムの裏側を覗き見することは、セキュリティ上、原則として禁止されています。root権限(最高権限)を持つスーパーユーザーだけが、すべてのプロセスとポートの紐付けを覗き見ることができるのです。
そのため、プロセスの情報をしっかり引き出したいときは、必ずコマンドの頭に sudo をつけて実行するようにクセづけておきましょう。
—
5. 犯人がわかったら?:スマートな後始末の作法
さて、無事に ss -lp によって「どのプログラムがどのポートを占有しているのか(PID)」が判明しました。例えば、古いテスト用のPythonスクリプト(PID: 9999)がうっかりポートを占有しっぱなしだったとしましょう。
ここで慌ててサーバーの電源コードを引っこ抜いたり、適当なコマンドでサーバーを再起動したりしてはいけません。私たちはプロのインフラエンジニアです。スマートにピンポイントで解決しましょう。
# 特定のプロセス(例:PID 9999)に優しく終了を促すシグナルを送る
sudo kill 9999
# 万が一、それでもしぶとく居座る場合の最終手段(強制終了)
sudo kill -9 9999
プロセスを安全に片付けたあと、もう一度 sudo ss -lp '(...)' で確認してみてください。先ほどまで埋まっていたポートがスッキリと解放され、あなたが本当に動かしたかった新しいサービスが、何のエラーもなくスムーズに起動するはずです。この瞬間、思わず「よしっ!」と小さくガッツポーズしたくなるはずです。
—
まとめ
今回は、ss コマンドの -l と -p オプションを組み合わせた、リスニングポートとプロセスの紐付けについて解説しました。
ssはnetstatの後継となる、超高速で頼れるネットワーク診断ツール。-lで待ち受けポートを絞り、-pでそこに紐づくプロセス名とPIDを暴き出す。- 実行する際は
sudoを忘れないこと。 - ポート競合のエラーに遭遇したとき、やみくもに再起動するのではなく、まずは
ss -lpで犯人を特定するのがプロの流儀。
インフラやネットワークの世界は、目に見えないパケットやプロセスの動きが主役です。だからこそ、こうした強力な「可視化ツール」の使い方を知っているかどうかで、トラブルシューティングのスピードが何倍も変わってきます。
次に「Address already in use」の赤字エラーに出くわしたときも、もう慌てる必要はありません。深呼吸をして、そっと黒い画面に sudo ss -lp と打ち込んでみてください。ネットワークの向こう側で何が起きているのか、コマンドがきっと正確に、そして静かに教えてくれるはずです。
それでは、また次回のNOCブログでお会いしましょう。あなたのサーバーールームに、今日も平穏なログが流れ続けますように!
コメント