Linuxで特定のポートを占有しているプロセスを特定することは、特にサーバーが起動しない、ポートが競合するなど、期待通りに動作しないときに非常に役立ちます。実行中のプロセスを特定し、適切なプロセスを強制終了するのは少し面倒ですが、一度コツをつかんでしまえば、かなり簡単です。さらに、コマンドを知っておくことで、プロセスを盲目的に強制終了してしまうのを防ぐことができます。このガイドでは、特定のポートをリッスンしているプロセスを特定し、管理するための最適なコマンドと手順を、実用的な例を交えて解説します。
Linuxでポートをリッスンしているプロセスを見つけて管理する方法
特定のポートでリッスンしているプロセスを見つける
特定のポートがビジー状態だったり、アプリが動作しなかったりする場合は、まず、実際に何がそのポートでリッスンしてsudo lsof -i :8000いるのかを確認する必要があります。例えば、ポート8000を確認するには、 を使用すると、どのプロセスがそのポートを占有しているかを確認できます。ここで重要なのはプロセス名ですが、さらに重要なのはPID(プロセスID)です。PIDがわかれば、プロセスの管理が容易になります。
これは、Webサーバーやローカル開発サーバーが動作しなくなった場合など、トラブルシューティングの際に魔法のような効果を発揮します。設定によっては、sudoを実行しないとコマンドが失敗することがあります。そのため、面倒なことはせずに、root権限または昇格した権限で実行してください。
すべてのリスニングTCPおよびUDPポートの一覧表示
あらゆるネットワークポートで何がリッスンしているかをもっと詳しく知りたいなら、sudo netstat -lntup| grep LISTENnetstat がお役に立ちます。確かにnetstatはちょっと古臭い感じがしますが、それでもしっかりしていて便利です。特に、適切なフラグを追加すれば、すべてのTCPとUDPのリスナーを一度に表示し、プロセスIDと名前も表示してくれるので便利です。
各部分の役割は次のとおりです。
-l– リスニングソケットのみを表示するフィルター-n– DNSルックアップを回避し、IPとポート番号のみを表示するため、時間を節約できます。-t– TCPに焦点を当てる-u– UDP-p– プロセスIDと名前が含まれており、誰が聞いているかを正確に特定するのに非常に役立ちます
場合によっては、出力が情報で埋もれないように、「LISTEN」や特定のポート番号などの特定のものを grep で検索したいこともあります。
既知のポートでリッスンしているプロセスを確認する
ポート番号が既にわかっていて、プロセスの詳細を確認したい場合は、 を実行するのが定番の方法です。例えば、PID 72005 がポート 8000 でリッスンしていることがわかったら、 を実行します。これにより、誰がどのコマンドでプロセスを開始したかがわかるので、プロセスを強制終了または再起動しても安全かどうかの判断材料になります。ps -aux | grep ps -aux | grep 72005
ちょっとしたヒント: 一部のプロセスは root または特定のユーザーによって開始されるため、ps出力内の情報から、権限があるかどうかや、root が所有するサービスであるかどうかなど、多くのことがわかります。
ポートを解放するためにプロセスを強制終了する
プロセス(例えばPID 72005)を特定し、それを削除したい場合は、 を実行してくださいsudo kill -9 72005。 は-9プロセスを即座に終了させますが、注意して使用してください。 プロセスにクリーンアップの機会を与えないからです。( は使用しません)を使用して正常停止するだけで十分な場合もあります。kill -9
強制終了した後、元のコマンドでポートが空いているかどうかを再確認します。
$ sudo lsof -i :8000
出力が表示されない場合は、そのポートは再び解放されています。サーバーやマシンを盲目的に再起動して、うまくいくことを期待するよりも効果的です。
一部の設定では、これに影響するファイアウォールやその他のネットワーク構成が使用される可能性がありますが、これらのコマンドはポートとプロセスを直接管理するコア部分をカバーします。