ポート競合時のプロセス特定と強制終了【PowerShell × Windows】
概要
ローカル開発中、ポート番号の競合(conflict)が原因でアプリケーションが起動しないケースはよくある。
特にバックエンドアプリケーションやフロントエンド開発サーバなど、指定ポートへのバインドが失敗する際、以下のようなエラーが出力される。
Error: listen EADDRINUSE: address already in use :::3000
bind: Address already in use
このようなエラーに対して、原因プロセスの特定と強制終了というアプローチは即効性があり、再発防止のための分析材料としても有効だ。
本記事では、Windows環境 × PowerShell 上で、対象ポートを占有しているプロセスを見つけ、的確にタスクを終了させる手順を解説する。
対象環境
OS : Windows 10 / 11
Shell: PowerShell 5.x / 7.x
利用するコマンド群
以下の2ステップで処理する。
- ポートを使用しているプロセスを特定
- 特定したプロセスID(PID)を強制終了
# Step 1: 特定のポート番号を使っているプロセスを調査
netstat -ano | findstr :3000
# Step 2: 該当プロセス(PID)を強制終了
taskkill /F /PID 1234
解説
1. netstat -ano | findstr :<port>
-
netstat -ano
-
-a
: すべての接続とリスニングポートを表示 -
-n
: アドレスとポートを数値形式で表示 -
-o
: 各接続に関連するプロセスID(PID)を表示
-
-
findstr :3000
- 出力結果からポート
3000
を使っている行をフィルタ
- 出力結果からポート
このコマンドで、対象ポートにバインドされているプロセスIDを把握できる。
2. taskkill /F /PID <pid>
-
/F
: 強制終了(Force)を指定 -
/PID
: 終了対象のプロセスIDを指定
たとえばPIDが1234なら以下のように入力:
taskkill /F /PID 1234
注意点
-
PIDの特定には管理者権限が必要な場合がある。
-
PowerShell
は「管理者として実行」推奨。
-
- 誤ってシステムプロセスをkillしないよう、
netstat
出力をよく確認すること。 - アプリケーションによっては終了しても自動再起動される場合がある(サービス設定等)。
応用:ポートを指定して自動終了スクリプト化
以下のようにスクリプト化して、任意のポートを指定して自動的に対象プロセスをkillすることも可能だ。
$port = Read-Host "Enter port number"
$line = netstat -ano | findstr ":$port"
if ($line) {
$pid = ($line -split '\s+')[-1]
Write-Output "Killing PID: $pid"
taskkill /F /PID $pid
} else {
Write-Output "No process found using port $port"
}
結語
ポート競合のトラブルは開発の初期段階で頻出する。
その都度、原因を手動で探るのではなく、即応できるPowerShellスニペットを習慣化しておくことが、スマートな開発者としての第一歩だ。
ローカル環境での安定した開発体験は、こうした細やかなオペレーションの積み重ねによって支えられている。