【備忘録】ポートを掴んでるプロセスを特定して殺す


そのポート掴んでんの誰じゃい

Eclipseからサーバ立ち上げてデバッグしようとしたら、ポートが使用中で起動できない状態に。
誰?誰が掴んでんの??そんなん立ち上げた記憶ないんだけど?
そんなときのための備忘録です。

※殺すときに管理者権限を要求されたら
「管理者として実行」でコマンドプロンプトを起動しておくのがオススメ。
PID特定するだけで殺さないとかなら(多分)権限は不要なので、そのまま起動で。

ポート番号からPIDを特定する

netstatで一覧取得してfindでポート番号指定して絞り込み。

>netstat -ano | find ":9080"
  TCP         127.0.0.1:9080         0.0.0.0:0              LISTENING       10428

PIDから逆引きしてサービスを確認

まあPIDわかったらGUIのタスクマネージャから確認してもいいんだけど。
java.exeなんて場合によってはいろんなところに置いてあるわけで、タスクマネージャから「ファイルの場所を開く」でパス見て確認したりもします。

>tasklist /fi "PID eq 10428"

イメージ名                     PID セッション名     セッション# メモリ使用量
========================= ======== ================ =========== ============
java.exe                     10428 Console                    1  1,073,312 K

オプション「/svc」で各プロセスに紐づいている「サービス」の名前が表示されます。

>tasklist /svc /fi "PID eq 10428"

イメージ名                     PID サービス
========================= ======== ============================================
java.exe                     10428 N/A

オプション「/v」だと詳細に見れるけど、状況によっては取得に時間がかかる場合も。
「セッション名」「セッション#」「メモリ使用量」「状態」「ユーザー名」「CPU時間」「ウィンドウタイトル」が確認できます。

PIDを指定して該当プロセスをkill

これもPIDわかったらGUIから殺せることもあるよね。管理者権限要求されるとかはあるけど。

>taskkill /F /PID 10428
成功: PID 10428 のプロセスは強制終了されました。

おまけ

taskkillコマンドの各種オプションとか。

パラメーター 説明
/s <コンピュータ> 名前またはリモートのIPを指定(\は使用しない)する。省略した場合はローカル。
/u <ドメイン>\<ユーザ名> ユーザまたはドメイン¥ユーザとして、指定ユーザの権限で実行する。省略した場合は実行ユーザ。
/p <パスワード> /u パラメータで指定したユーザアカウントのパスワードを指定する。省略した場合はパスワードなし扱い、指定したがパラメータなしだとプロンプトで入力。
/fi <フィルター> 対象または除外するプロセスの種類を指定する。フィルタはワイルドカード(\*)や複数(の場合はAND条件で絞り込み)指定が可能。詳細は公式ドキュメントを参照。
/pid 終了するプロセスのPIDを指定する。
/im <イメージ名> 終了するプロセスのイメージ名を指定する。通常は拡張子を含むファイル名(hoge.exe)となる。ワイルドカード(\*)を使用する場合は、/fiが必須(/fiなしはエラー)。複数指定した場合はOR条件で絞り込み。
/t 親プロセスを指定する。指定した親プロセスのすべての子プロセスも一括終了させられる。子プロセスに対しての絞り込みは不可。
/f 強制終了するプロセスを指定する。リモートプロセスの場合、省略してもすべて強制終了となる。

最初からイメージ名がわかっている場合は、PIDなくても殺せるね!

Microsoftの公式ドキュメントはこちら→ taskkill | Microsoft Docs