こんにちは!Linuxサーバーを管理していると、こんな疑問がよく湧いてきます。「あれ?今80番ポートをどのサービスが使っているんだろう?」「このウェブサーバーはプロセスが複数あるけど、どれが本当のメインプロセスなんだろう?」
今日は、これらの疑問を解決する「Linux探偵」になってみる時間を取りたいと思います。たった一つのポート番号という手がかりから始まり、容疑者(プロセス)を特定し、その背後にいるマスタープロセスまで探し出す、スリリングな過程を一緒に体験しましょう!🕵️♀️

1段階: 最初の手がかり – ポート番号でプロセス容疑者を見つける 📡
すべての捜査は小さな手がかりから始まります。私たちの最初の手がかりは「ポート番号」です。特定のポートへのリクエストを誰が受け取っているかを確認すれば、容疑線上に挙げるプロセスを特定できます。
この時に使う最も現代的で強力なツールが、ssコマンドです。(netstatという古典的なツールもありますが、ssの方が速く、より多くの情報を提供します。)
sudo ss -tlpn | grep ':[포트번호]'
# 80番ポートを例に探してみましょう。
sudo ss -tlpn | grep ':80'
コマンドは少し複雑に見えますが、オプションの意味を知れば簡単です。
- -t: TCPプロトコルのみを表示。
- -l: Listening(接続を待機している)状態のもののみを表示。
- -p: そのポートを使用しているProcess情報を表示。(最も重要!)
- -n: ポート番号やIPアドレスをNumeric(数字)形式で表示。(素早い確認が可能)
このコマンドを実行すると、次のような結果が得られます。
LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("apache2",pid=1337,fd=4))
さて、犯人が判明しましたね!users:の部分を見ると、apache2という名前のアプリケーションがPID(プロセスID)1337で実行され、80番ポートを占有していることが確認できました。最初の捜査段階完了!
2段階: 徹底捜査 – プロセス階層構造を解き明かす 👨👩👧
apache2という容疑者を特定しましたが、捜査はここで終わりではありません。psコマンドでapache2プロセスを照会してみると、複数のプロセスが同時に実行されていることがわかるでしょう。
これは、ウェブサーバーのようなプログラムが効率的な業務処理のために、一つのマスタープロセスが複数のワーカープロセスを生成・管理する構造で動作するためです。まるでレストランのマネージャー(マスター)が、複数の料理人やサービススタッフ(ワーカー)を管理するようなものです。🍳
私たちの任務は、これらのうち本当の「ボス」、つまりマスタープロセスを見つけ出すことです。この時に使うコマンドはps -efです。
ps -ef | grep apache2
結果は以下のように表示されます。
UID PID PPID C STIME TTY TIME CMD
root 1337 1 0 10:30 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 1380 1337 0 10:30 ? 00:00:00 /usr/sbin/apache2 -k start
www-data 1381 1337 0 10:30 ? 00:00:00 /usr/sbin/apache2 -k start
ここで、マスタープロセスを示す決定的な証拠を探してみましょう。
- 証拠1: 実行ユーザー(UID)がrootである。
- マスタープロセスはシステムリソースにアクセスしたりポートを開いたりするなど、高い権限が必要なため、通常rootアカウントで実行されます。一方、ワーカープロセスはセキュリティのために権限の低いユーザー(www-dataなど)で実行されます。
- 証拠2: 親プロセスID(PPID)が1である。
- PPIDが1であるということは、そのプロセスがシステム起動時に最初に実行されるプロセス(systemdまたはinit)によって直接実行されたことを意味します。つまり、このプロセスツリーの「始祖」というわけです。
- 証拠3: 他のワーカーの親がまさにこのプロセスである。
- 他のapache2プロセスのPPIDを見てください。すべて1337を指していますよね?これがまさにPID 1337が彼らの親、つまりマスタープロセスであるという最も確実な証拠です。
すべての証拠がPID 1337をマスタープロセスとして指し示しています。
3段階: 捜査報告書作成 – 結果を安全にファイルに保存する ✍️
すべての捜査が終わったので、結果を報告書として残す必要があります。見つけ出したアプリケーション名(小文字)とマスターPIDを/opt/process.txtのようなファイルに保存してみましょう。
ここで注意点!/optや/etcのようなシステムディレクトリは、ファイルを生成するためにroot権限が必要です。多くの方がsudo echo “内容” > /opt/file.txtのような間違いを犯しがちです。このコマンドはechoだけがsudoで実行されるだけで、ファイルに書き込む役割(>)は現在のユーザー権限で実行されるため、「Permission denied」エラーに遭遇することになります。
最も安全で確実な方法は、teeコマンドを使用することです。
printf "apache2
1337
" | sudo tee /opt/process.txt
このコマンドは次のように動作します。
- printf “apache2n1337”: 最初の行にapache2、改行(説明では
で表現)を挟んで2行目に1337というテキストを生成します。
- | (パイプ): 生成されたテキストを次のコマンドの入力として渡します。
- sudo tee /opt/process.txt: root権限でteeを実行します。teeはパイプで渡された入力を画面とファイルの両方に同時に書き出す役割を果たします。これにより、権限の問題なく安全にファイルを生成できます。
まとめ
おめでとうございます!あなたはもうLinuxサーバーの有能な探偵になりました。🎉
今日私たちは、ポート番号(ss)という小さな手がかりから始まり、プロセスの家族関係(ps -ef)を解き明かしてマスタープロセスを見つけ出し、捜査結果を権限問題なくきれいにファイル(tee)に残す方法まで学びました。
これら3つのコマンドは、システムを監視し問題を解決するために必ず必要な技術ですので、ぜひ覚えて実際のサーバー運用に活用してみてください!
タグ: Linux, リ눅스, サーバー管理, システムエンジニアリング, DevOps, プロセス, ポート, PID, ss, ps, tee
コメントを残す