web-dev-qa-db-ja.com

使用しているポートを.BATから調べてプロセスを強制終了する

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

118
Mike Flynn

これを始めるためのコマンドは次のとおりです。

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を実行し、その出力をループすることができます。それぞれの行は%variableに詰め込まれ、あなたが好きな場所で好きなだけotherCommandに展開することができます。実際に使用されている%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を使用します。

135

コマンドを開くプロンプトを表示して、以下のコマンドを実行します。

 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です

192
Mohit Singh

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

netstat -ano | findstr 8080

ここでコマンドの下のプロセスの使用を殺すために21424はプロセスIDです

taskkill /pid 21424 /F 
51

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
19
Solubris

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

ネットスタット"8080"を見つける

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

それからプロセスを殺すために次のコマンドを実行します

taskkill/F/PID 10612

16
Sardesh Sharma

/ 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停止ServiceName

13
xtrm
3
CharlesB

完成のためだけに:

特定のポートに接続されているすべてのプロセスを強制終了したいが、待機しているプロセスは強制終了したくない

ポート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 - > all
  • n - >解決しない(速い)
  • o - > pid

Netstatが送信元ポート、送信先ポート、そしてESTABLISHEDの順に出力するのでうまくいきます。

2
Boop

下記の内容で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」をクリックして終了します。

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"):
1
bahrep

誰かがPowershell Scriptを探しているなら:

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と入力します。

0
watzon

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

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

%%Pの代わりにバッチpu %Pでそれを使いたい場合

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
Vineetha Swathi

Merlynの応答に似ていますが、これはこれらのケースも処理します。

  • ポート番号は、実際には探していない別の長いポート番号の左部分文字列です。あなたはランダムな、無実のプロセスを殺さないように正確なポート番号を探したいのです!
  • スクリプトコードは2回以上実行でき、その都度正しいものである必要があります。古い、誤った回答は表示されません。

ここにあります:

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
Yavin5

あなたがシステムによってあなたがそれをタスクを終了することはできません。このコマンドを試してください

x:>ネットストップhttp/y

0