プロセスが使用しているポートを.BATからルックアップしてプロセスを強制終了する


128

Windowsで何がポート8080を探し、それが.BATファイルを介して使用しているプロセスを殺そうとすることができますか?


コマンドプロンプトからコマンド 'netstat -a -n -o'を使用すると、プロセスのリストとプロセスがリッスンしているポート(およびipとそれらは別のIPに接続されているかどうか。結果を改善するためのより良いスイッチがあることはほぼ間違いありませんが、私はそれらをすぐに思い出すことができません...うまくいけば誰かがこれに基づいて構築できますか?
Dave

Linuxではできます。cygwinをインストールすると、バットでも同様に実行できます
Dani

@ Dani、Mike:Cygwinは大きな依存関係であり、この問題を解決する必要はありません。ただし、すでに入手している場合は、それを使用してください。Linuxコマンドラインツールの方がはるかに優れています。
Merlyn Morgan-Graham

回答:


141

ここにあなたを始めるためのコマンドがあります:

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P

バッチファイルに自信がある場合は、を削除し@ECHOます。

FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /PID %%P

OSによっては、これを少し変更する必要がある場合があります。たとえば、Windows 7 tokens=5ではの代わりに必要になる場合がありますtokens=4

この仕組み

FOR /F ... %variable IN ('command') DO otherCommand %variable...

これにより、を実行しcommand、その出力をループできます。各行はに詰め込まれ%variableotherCommand好きな場所で好きなだけ何度でも拡張できます。 %variable実際の使用では、1文字の名前のみを使用でき%Vます。

"tokens=4 delims= "

これにより、各行を空白で分割し、その行の4番目のチャンクを取り出して%variable(この場合は%%P)詰め込みます。 delims空に見えますが、その余分なスペースは実際には重要です。

netstat -a -n -o

実行して見つけてください。コマンドラインヘルプによると、「すべての接続とリスニングポートを表示します」、「アドレスとポート番号を数値形式で表示します」、「各接続に関連付けられている所有プロセスIDを表示します」。他の誰かがそれを提案したので私はこれらのオプションを使用しました、そしてそれはたまたまうまくいきました:)

^|

これにより、最初のコマンドまたはプログラム(netstat)の出力が取得され、2番目のコマンドプログラム(findstr)に渡されます。あなたが代わりにコマンド文字列内で、コマンドラインで直接これを使用していた場合は、使用する|代わりに^|

findstr :8080

これは、渡されたすべての出力をフィルタリングし、を含む行のみを返します:8080

TaskKill.exe /PID <value>

これにより、プロセスIDを使用して実行中のタスクが強制終了されます。

%%P instead of %P

これはバッチファイルで必要です。コマンドプロンプトでこれを行った場合は、%P代わりに使用します。


あなたは、などのトークン、delims、チェックしてプレイする必要があるかもしれないHELP FOR他の多くのオプションを参照するには、コマンドラインでFORあなたを与えるだろうし、チェックnetstat -?findstr /?TaskKill /?さえより多くの助けのために。
Merlyn Morgan-Graham、2011

私はそれを試して、あなたに戻ります。
マイクフリン

6
FOR / F "tokens = 5 delims =" %% P IN( 'netstat -a -n -o ^ | findstr:8080')DO TaskKill.exe / F / PID %% P
Mike Flynn

10
これは素晴らしい。tokens=4私が考えるWindows XPとtokens=5Windows 7 /Fです。強制終了することもお勧めします。
Strelok、2011

1
MerlynMorgan-グラハム@これが受け入れ答えであるから、ポイントを追加することを検討してくださいとしてstackoverflow.com/a/20637662/5243762この答えだけでなく
IAmSurajBobade

196

コマンドプロンプトを開き、次のコマンドを実行します

 C:\Users\username>netstat -o -n -a | findstr 0.0:3000
   TCP    0.0.0.0:3000      0.0.0.0:0              LISTENING       3116

C:\Users\username>taskkill /F /PID 3116

、ここで3116はプロセスIDです


ええ、それはどこでも異なります
Mohit Singh

3
非常に便利 !0.0:0.0ではなく127.0.01を下回る可能性があるため、0.0:3000ではなく:3000を検索することに注意してください
Leeeeeeelo

2
ありがとう、制御不能のwebpack開発タスクを殺す素晴らしい仕事:)
danjah

または、単にnetstat -ano | findstr:9797 taskkill / PID typeyourPIDhere / Fここで9797はポート番号です。私はこのコマンドを頻繁に使用して、誤動作/ハングしたサーバーを強制終了しています。
Mohit

53

コマンドラインで特定のプロセスを見つけるには、以下のコマンドを使用します。8080はプロセスが使用するポートです

netstat -ano | findstr 8080

ここでコマンドを使用してプロセスを強制終了するには21424がプロセスIDです

taskkill /pid 21424 /F 

@EralpBエンジョイ:)
Girdhar Singh Rathore

19

Merlynのソリューションを使用すると、Firefoxなどの他のアプリケーションが強制終了されました。これらのプロセスは同じポートを使用していましたが、リスナーとしては使用していませんでした:

例えば:

netstat -a -n -o | findstr :8085
  TCP    0.0.0.0:8085           0.0.0.0:0              LISTENING       6568
  TCP    127.0.0.1:49616        127.0.0.1:8085         TIME_WAIT       0
  TCP    127.0.0.1:49618        127.0.0.1:8085         TIME_WAIT       0

したがって、次のようにfindstrに「LISTENING」を追加することで、これらを除外できます。

FOR /F "tokens=5 delims= " %%P IN ('netstat -a -n -o ^| findstr :8085.*LISTENING') DO TaskKill.exe /PID %%P

18

ポート8080で実行されているすべてのプロセスをリストするには、次のようにします。

netstat -ano | 「8080」を見つける

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

TCP    [::]:8080              [::]:0                 LISTENING       10612

次に、プロセスを強制終了するには、次のコマンドを実行します

taskkill / F / PID 10612


13

/ F強制スイッチもTaskKillで送信しない限り、一部のプロセスが終了しないことを追加してください。また、/ Tスイッチを使用すると、プロセスのすべてのセカンダリスレッドが閉じられます。

C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^|
 findstr :2002') DO TaskKill.exe /PID %P /T /F

サービスの場合、サービスの名前を取得して実行する必要があります。

sc Stop ServiceName


2

完了のために:

特定のポートに接続されているすべてのプロセスを強制終了したいが、リッスンしているプロセスは強制終了しなかった

ポート9001の(cmdシェルの)コマンドは次のとおりです。

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P

findstr

  • rは式を表し、cは正確なチェーンを照合します。
  • [] *はスペースを照合するためのものです

netstat

  • a->すべて
  • n->解決しない(高速)
  • o-> pid

netstatが送信元ポート、宛先ポート、ESTABLISHEDの順に出力するため、これが機能します。


2

以下の内容のbatファイルを作成し、ポート番号の入力を受け入れます

@ECHO ON
set /p portid=Enter the Port to be killed: 
echo %portid%                                                                              
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr %portid% ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine                                                   
:SkipLine                                                                              
echo ProcessId to kill = %ProcessId%
taskkill /f /pid %ProcessId%
PAUSE

最後に「Enter」をクリックして終了します。


@TusharPandeyこれはWindowsでタグ付けされた質問なので、シェルスクリプトではなくWindowsスクリプトです
Sireesh Yarlagadda '

1

ポート8080でリッスンしているプロセスを強制終了する場合は、PowerShellを使用できます。Get-NetTCPConnectionコマンドレットとを組み合わせるだけStop-Processです。

テスト済みで、Windows 10またはWindows Server 2016上のPowerShell 5で動作するはずです。ただし、PowerShell 5がインストールされている古いWindowsバージョンでも動作するはずです。

次に例を示します。

PS C:\> Stop-Process -Id (Get-NetTCPConnection -LocalPort 8080).OwningProcess

Confirm
Are you sure you want to perform the Stop-Process operation on the following item: MyTestServer(9408)?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "Y"):

0

マーリンの応答に似ていますが、これはこれらのケースも処理します:

  • ポート番号は、実際には、探していない別の長いポート番号の左側の部分文字列です。ランダムで無害なプロセスを強制終了しないように、正確なポート番号を検索 する必要があります。
  • スクリプトコードは、複数回実行でき、毎回正しく、古い不正確な回答を表示しないようにする必要があります。

ここにあります:

set serverPid=
for /F "tokens=5 delims= " %%P in ('netstat -a -n -o ^| findstr /E :8080 ') do set serverPid=%%P
if not "%serverPid%" == "" (
  taskkill /PID %serverPid%
) else (
  rem echo Server is not running.
)

0

手順:

  1. Apache Tomcatサーバーのconfフォルダーに移動します。私の場合、apache-tomcat-7.0.61を使用しているため、apache-tomcat-7.0.61\conf

  2. server.xmlポート番号を開いて、8080から他のポートに変更します。例:8081,8082,8087など

  3. 次にbinフォルダに移動して実行しますshutdown.bat

  4. 次に、Eclipseを使用してサーバーを再起動します。

これでプロジェクトは中断することなく機能します。


0

誰かがPowershellスクリプトを探しているなら:

function Search-And-Destroy
{
    param ( [Parameter(Mandatory=$true)][string]$port )
    $lines = netstat -a -o -n | findstr $port
    $ports = @()

    ForEach($line In $lines)
    {
        $res = $($lines -split '\s+')
        $ports += $res[5]
    }

    $ports = $ports | select -uniq

    ForEach($port In $ports)
    {
        echo $(taskkill /F /PID $port)
    }
}

この関数は基本的に上記の関数の機能を実行しますが、Powershellスクリプト形式であるため、Powershellプロファイルに追加できます。プロファイルの場所を見つけるには、powershellに移動して次のように入力しますecho $profile


1
これは実際にはPowerShellスクリプトではなく、PowerShellベースのラッパーnetstatツールです。
2016年

0

これをコマンドラインに貼り付けます

FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| find "LISTENING" ^| find ":8080 "') DO (TASKKILL /PID %P)

%%P代わりにバッチpuで使用する場合%P


これはOSの言語に依存していますが、すべての言語で機能させる方法はありますか?
ヤコブ

@JakobこれはWindowsのcmdターミナルでのみ実行でき、.cmdまたは.batファイルでも実行できます
Eduard Florinescu

はい、ただし英語のみです。それ以外の場合、「LISTENING」はOSの言語に翻訳されます。
ヤコブ

@Jakob netstatツールが他の言語に翻訳されていることを知りません
Eduard Florinescu

0

システムによっては、タスクを終了できません。このコマンドを試してください

x:> net stop http / y


3
「システム別」の意味は?そして、この答えは他のどの答えよりもどうですか?
Nico Haase
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.