Windowsで特定ポート使用中のプロセスを特定して強制終了するコマンド

Node.jsやNext.js、Pythonなどのローカル開発環境でWebアプリケーションを起動しようとした際、「Error: listen EADDRINUSE: address already in use :::3000」や「Port 3000 is already in use」といったエラーが表示され、サーバーの起動に失敗することがあります。

ターミナルをCtrl + Cで閉じたつもりでもバックグラウンドにプロセスが残っていたり、別のターミナルウィンドウで過去に起動したプロセスがポートを占有し続けていたりすることが主な原因です。

パソコンを再起動すれば解消しますが、起動中の他のアプリケーションを閉じたり再起動を待ったりするのは時間がかかり、開発のリズムが途切れてしまいます。

この記事では、Windows環境で特定ポートを使用しているプロセスID(PID)を素早く特定し、コマンドラインから強制終了してポートを解放する手順をわかりやすく解説します。

この記事で行うこと

  • netstatコマンドを使用して特定ポート(例:3000番)を占有しているプロセスID(PID)を特定する
  • taskkillコマンドで該当PIDのプロセスを強制終了し、ポートを即座に解放する
  • PowerShellのワンライナーでポート特定から強制終了までを1行で実行する
  • 安全確認のためにタスクマネージャーでプロセス名を確認してから終了する手順を理解する
  • taskkillで「アクセスが拒否されました」とエラーが出る原因と管理者権限での対処法を把握する

前提条件・対象読者

  • 対象OS: Windows 10 または Windows 11
  • 使用ツール: コマンドプロンプト、PowerShell、またはWindows Terminal
  • 対象読者: Web開発やプログラミング中にポートの重複(EADDRINUSEエラー)に遭遇した方
  • 検証環境: Windows 11 Pro、PowerShell 7 / Windows PowerShell 5.1

【結論】ポート使用プロセスを特定して強制終了する2行コマンド

急ぎでポートを解放したい方向けに、結論となる2行のコマンドを紹介します。 3000番ポートが塞がっていて解放したい場合は、コマンドプロンプトまたはPowerShellで以下の2行を順番に実行してください。

netstat -ano | findstr :3000

出力結果の右端に表示される5桁前後の数字(PID)を確認し、次のコマンドを実行します(PIDが12345の場合)。

taskkill /F /PID 12345

この2ステップだけでポートが解放され、すぐに開発サーバーを再起動できるようになります。 各コマンドの詳しい意味やオプションの解説、PowerShellを使ったワンライナーなどは以下のステップで解説します。

ステップ1:ポートを使用しているプロセスID(PID)を調べる(netstat -ano)

ポートがどのプロセスに占有されているかを調べるには、ネットワーク接続状態を表示するnetstatコマンドと、文字列検索を行うfindstrコマンドを組み合わせます。

コマンドプロンプトまたはPowerShellを開き、以下のコマンドを実行します。ここでは開発でよく使われる3000番ポートを例にします。

netstat -ano | findstr :3000

ポート番号を指定する際は、必ずポート番号の直前にコロン「:」を付けて「:3000」と指定してください。コロンを付けずに「findstr 3000」と指定すると、IPアドレスの一部やプロセスIDにたまたま「3000」という数字が含まれている無関係な行までヒットしてしまうためです。

コマンドで指定している各オプションの役割は以下の通りです。

オプション役割
-aすべての接続とリッスン(待機)しているポートを表示する
-nアドレスとポート番号を数値形式(IP:ポート)で表示する
-o各接続に関連付けられているプロセスのプロセスID(PID)を表示する
findstr :3000netstatの出力結果から「:3000」が含まれる行のみを抽出する

コマンドを実行すると、以下のような結果が表示されます。

 TCP    0.0.0.0:3000           0.0.0.0:0              LISTENING       12345
 TCP    [::]:3000              [::]:0                 LISTENING       12345

出力結果の一番右端にある数字(この例では「12345」)が、ポート3000を使用しているプログラムの「プロセスID(PID)」です。 状態(State)が「LISTENING」になっている行の右端の数字をメモしてください。IPv4(0.0.0.0)とIPv6([::])の両方で待機している場合は同じPIDが2行表示されることが一般的です。

もしコマンドを実行しても何も出力されない場合は、指定したポートを使用しているプロセスは存在していません。ポート番号の入力ミスがないか確認してください。

ステップ2:PIDを指定してプロセスを強制終了する(taskkill /F /PID)

プロセスID(PID)が特定できたら、Windows標準のプロセス終了コマンドであるtaskkillを使って該当プロセスを強制終了します。

ステップ1で確認したPIDを指定して、以下のコマンドを実行します(PIDが12345の場合)。

taskkill /F /PID 12345

オプションの役割は以下の通りです。

オプション役割
/Fプロセスを強制終了する(Force)
/PID [数値]終了対象のプロセスID(Process ID)を指定する
/T(任意)指定したプロセスによって起動された子プロセスもまとめて終了する(Tree)

コマンドが正常に完了すると、以下のメッセージが表示されます。

成功: PID 12345 のプロセスは強制終了されました。

これでポートを占有していたプロセスが終了し、ポートが即座に解放されます。

開発サーバーの起動コマンド(npm run devなど)によっては、メインのプロセスの配下で子プロセスが起動していることがあります。親プロセスだけを終了しても子プロセスがポートを掴んだまま残るケースがあるため、確実にすべて終了させたい場合は「/T」オプションを追加して以下のように実行するのもおすすめです。

taskkill /F /T /PID 12345

PowerShellを使った1行ワンライナー(Get-NetTCPConnectionとStop-Process)

日常的にPowerShellを使用している場合、netstatでPIDを調べてからtaskkillに貼り付けるという2段階の操作を面倒に感じることがあります。 PowerShell専用のコマンドレットをパイプラインで繋ぐことで、ポートの検索からプロセスの強制終了までを1行で完結させることができます。

PowerShellで以下のワンライナーを実行します(3000番ポートの場合)。

Get-NetTCPConnection -LocalPort 3000 -ErrorAction SilentlyContinue | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }

コマンドの仕組みは以下の通りです。

  • Get-NetTCPConnection -LocalPort 3000: 3000番ポートを使用しているTCP接続情報を取得します。
  • -ErrorAction SilentlyContinue: 指定したポートが使われていない場合にエラーメッセージを出さず、処理を終了させます。
  • ForEach-Object { Stop-Process -Id $_.OwningProcess -Force }: 取得した接続情報のプロパティ「OwningProcess(所有しているPID)」を取り出し、Stop-Processコマンドレットに渡して強制終了(-Force)します。

より短く書きたい場合は、以下のようにカッコで括ってPIDを渡す記法も利用できます。

Stop-Process -Id (Get-NetTCPConnection -LocalPort 3000).OwningProcess -Force

このコマンドをPowerShellのプロファイル($PROFILE)に関数やエイリアスとして登録しておけば、「killport 3000」のような短いコマンドで呼び出せるようになり、開発の利便性が大幅に向上します。

タスクマネージャーでプロセス名を確認してから終了する方法

PIDの数字だけを見ていきなり強制終了することに不安がある場合や、何のアプリがポートを使用しているのかプロセス名(node.exe、python.exeなど)を確認してから安全に終了したい場合は、タスクマネージャーを活用します。

手順は以下の通りです。

  1. ショートカットキー「Ctrl + Shift + Esc」を押してタスクマネージャーを起動します。
  2. 左側のナビゲーションメニュー(または上部タブ)から「詳細」を選択します。
  3. プロセスの一覧に「PID」列が表示されていることを確認します。もしPID列がない場合は、列ヘッダー(「名前」など)を右クリックして「列の選択」を開き、「PID」にチェックを入れて「OK」をクリックします。
  4. 「PID」列のヘッダーをクリックして昇順または降順に並べ替え、ステップ1で確認したPID(例:12345)を探します。
  5. 「名前」列を確認し、開発中のプロセス(node.exe、python.exe、java.exeなど)であることを確かめます。
  6. 対象のプロセスを右クリックし、「タスクの終了」をクリックします。

Windowsの重要なシステムプロセス(svchost.exeやSystemなど)を誤って強制終了してしまうリスクを避けたい場合は、この手順でプロセス名を確認してから終了すると安心です。

taskkillで「アクセスが拒否されました」と出る場合の対処法(管理者権限で実行)

taskkillコマンドを実行した際に、以下のようなエラーメッセージが表示されて終了できない場合があります。

エラー: プロセス (PID 12345) を強制終了できませんでした。
理由: アクセスが拒否されました。

このエラーが発生する主な理由は、終了しようとしているプロセスが「管理者として実行」で起動されているか、Windowsのシステム権限で動作しているためです。一般的なユーザー権限で起動したターミナルからは、上位の権限を持つプロセスを操作できません。

この場合は、ターミナルを管理者権限で起動し直すことで解決できます。

  1. Windowsキーを押すか、タスクバーの検索バーをクリックします。
  2. 「cmd」または「powershell」「terminal」と入力します。
  3. 検索結果に表示されたアプリのアイコンを右クリックし、「管理者として実行」を選択します(または右側のメニューに表示される「管理者として実行」をクリックします)。
  4. 「このアプリがデバイスに変更を加えることを許可しますか?」というユーザーアカウント制御(UAC)画面が表示されたら、「はい」をクリックします。
  5. ウィンドウのタイトルバーに「管理者:」と表示されていることを確認し、再度taskkillコマンドまたはPowerShellワンライナーを実行します。

管理者権限でターミナルを起動して実行すれば、アクセス拒否エラーを回避して確実にプロセスを終了できます。

次に読むおすすめ記事

WSL2とDockerを使ったWindows開発環境の構築手順や高速化設定、トラブル解決を体系的に学びたい方は、以下の完全ガイドもあわせて参考にしてください。

WSL2+Dockerで作るWindows開発環境構築まとめ
WindowsマシンでWeb開発やバックエンド開発、AIアプリ開発を行う際、いまや欠かせない標準構成となったのが「Windows + WSL2 + Docker + VS Code」の組み合わせです。かつては「Web開発といえばMac一択」…

参考情報

Stop-Process (Microsoft.PowerShell.Management) – Microsoft Learn

netstat コマンドの構文とオプション – Microsoft Learn

taskkill コマンドのリファレンス – Microsoft Learn

Get-NetTCPConnection (NetTCPIP) – Microsoft Learn