Windowsで新しいサービスやアプリを起動しようとすると、「ポートは既に使用されています」という典型的なメッセージが表示されるのは非常にイライラするものです。ローカルサーバーやテスト環境を起動しようとしている場合もあれば、単にポートを他の用途に解放したい場合などもあるでしょう。多くの場合、気づかないうちに何らかのプロセスがポートを占有しています。このガイドでは、特定のTCPまたはUDPポートをリッスンしているプロセスを特定する方法と、必要に応じてそのプロセスを強制終了する方法を解説します。この方法を知っていれば、特にポートのロックアウトが頻繁に発生し、再起動したり、手動で頑固なプロセスを探したりする必要がある場合、膨大な時間を節約できます。
基本的に、ポートがビジー状態の場合、新しいアプリはエラーを吐き出したり、起動を拒否したりする可能性があります。重要なのは、そのポートを占有しているものを特定し、それを閉じるか解放することです。Windowsではどのプロセスがポートを所有しているかを直接表示しないため、必ずしも明らかではありません。幸いなことに、netstatやPowerShellなどのコマンドラインツールを使えば、この作業ははるかに簡単になります。環境によっては、フルアクセスを得るためにこれらのコマンドを管理者として実行する必要があるかもしれません。さらに、状況がさらに悪化する場合は、 SysinternalsのTCPViewなどのツールを使うと、すべてのネットワーク接続をGUIで確認できます。これは、クリック操作を好む人にとっては非常に便利です。
Windowsでポートを占有しているプロセスを見つけて終了する方法
方法1: netstat + tasklistを使用する – 定番の組み合わせ
この方法は、特定のポート(例えばポート80や8080)の状況をざっと確認したい場合に役立ちます。 を実行すると、netstat -aon | find "LISTEN"すべてのリスニングポートとそのプロセスID(PID)が表示されます。その後、 を使って、これらのPIDと実際のプロセスを照合できますtasklist /FI "PID eq [PID]"。[PID] をnetstatに表示されるものに置き換えてください。
netstat -aon | findstr ":80" | findstr "LISTENING"
出力は次のようになります。
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 12345
末尾の数字(ここでは12345)がPIDです。それがどのプロセスであるかを確認するには、次のコマンドを実行します。
tasklist /FI "PID eq 12345"
これにより、ポートを大量に消費している実行ファイル(tiny.exe、nginx、IISワーカーなど)が明らかになることがよくあります。場合によっては、バックグラウンドで実行されていることに気づいていなかったプロセスが原因の場合もあります。その場合は、次のコマンドですぐに強制終了できます。
Stop-Process -Id 12345
コマンドプロンプトまたはPowerShellから実行します。必ずしもクリーンな方法ではありませんが、問題なく動作します。ただし、システムプロセスを強制終了すると動作が不安定になる可能性があるため、実行する前に安全であることを確認してください。
方法2: PowerShellを使用してワンライナーを実行する
PowerShellに慣れているなら、こちらの方がずっと速いです。ポート80をリッスンしているプロセスを確認するには、次のコマンドを実行します。
Get-Process -Id (Get-NetTCPConnection -LocalPort 80).OwningProcess
これでプロセス名が出力されるはずです。PIDを手動で照合するよりもはるかに簡単です。UDPポートも同様です。Get-NetTCPConnectionに変更するだけですGet-NetUDPEndpoint。
プロセス名は明らかな場合もあります(tiny.exe など)。しかし、実行ファイルの場所を特定する必要がある場合もあります。プロセスの場所を特定するには、以下のコマンドを使用します。
where /R C:\ tiny
または、コマンドプロンプトを管理者として起動して実行してください。これにより、PIDの背後で実行されている実行ファイルを確認できます。場合によっては、プロセスがスタックしているか、正常にシャットダウンしなかったアプリの残骸である可能性があります。その場合は、Stop-Process次のコマンドでプロセスを強制終了すると、ポートがすぐにクリアされます。
オプション3: グラフィカルなアプローチとしてTCPViewを使用する
コマンドラインが苦手な方は、Windows SysinternalsのTCPViewツール(こちら)をお試しください。このツールは、すべてのTCPポートとUDPポートを、プロセス名とフルパス付きでリアルタイムかつ見やすく表示します。コマンドを操作せずに、アクティブにリッスンしているもの、接続中のもの、あるいはポートを占有しているものを確認したい場合に最適です。netstatだけでは明らかにならない、隠れたプロセスやサービスが明らかになることもあります。さらに、インターフェースからタスクを右クリックして直接終了することも可能です。
1 つの奇妙な点: プロセスはバックグラウンドで実行されているシステム サービスである場合があり、それを強制終了すると何かが壊れる可能性があります。実稼働ボックスまたは重要なサーバーでこれを行う場合は注意してください。
プロセスを強制終了すると何が起こりますか?
netstatプロセスを特定して終了すると、ポートが解放されるはずです。またはで再度確認して、Test-NetConnection localhost -Port 80ポートが利用可能になったことを確認してください。それでも利用できない場合、再起動後にプロセスが再び表示される場合は、自動起動するサービスである可能性があります。サービスで確認するか、安全であれば無効にしてください。
繰り返しになりますが、なぜそうなるのかは分かりませんが、Windows は頑固なプロセスを維持したり、自動的に再起動したりすることがあります。そのような場合は、GUI ツールを使うか、特定のサービスを無効化すると解決できる場合があります。