通过从.BAT中查找正在使用的端口来终止进程

在Windows中,可以查找端口8080并尝试通过.BAT文件终止正在使用的进程?

这是一个让你开始的命令:

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

如果您对batch file有信心,请删除@ECHO

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

请注意,对于不同的操作系统,您可能需要稍作更改。 例如,在Windows 7上,您可能需要tokens=5而不是tokens=4

这是如何工作的

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

这使您可以执行command ,并循环输出。 每一行都会填入%variable ,并且可以随意扩展到otherCommand任何地方,无论你喜欢什么。 实际使用中的%variable只能有单字母名称,例如%V

 "tokens=4 delims= " 

这可以让你用空格分割每一行,然后取第四行,并将其填入%variable (在我们的例子中为%%P )。 delims看起来是空的,但是额外的空间实际上是很重要的。

 netstat -a -n -o 

只要运行一下,找出来。 根据命令行帮助,它显示“显示所有连接和侦听端口”,“以数字forms显示地址和端口号”,以及“显示与每个连接关联的拥有进程ID”。 我刚刚使用这些选项,因为别人build议,而且恰巧工作:)

 ^| 

这需要第一个命令或程序( netstat )的输出,并将其传递到第二个命令程序( findstr )。 如果您直接在命令行中使用此命令,而不是在命令string中,则可以使用| 而不是^|

 findstr :8080 

这将筛选传入的所有输出,仅返回包含:8080:8080

 TaskKill.exe /PID <value> 

这会使用进程ID来杀死正在运行的任务。

 %%P instead of %P 

这在batch file中是必需的。 如果您在命令提示符下执行了此操作,则可以使用%P

打开命令提示符并运行以下命令

  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

要查找命令行上的特定进程,请使用下面的命令8080是进程使用的端口

 netstat -ano | findstr 8080 

杀死进程使用下面的命令这里21424是进程ID

 taskkill /pid 21424 /F 

使用Merlyn的解决scheme导致其他应用程序像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 

要列出在端口8080上运行的所有进程,请执行以下操作。

netstat -ano | find“8080”

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

然后杀死进程运行以下命令

taskkill / F / PID 10612

谢谢大家,只是添加一些过程将不会closures,除非/ F的强制开关也发送TaskKill。 同样用/ T开关,进程的所有辅助线程将被closures。

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

对于服务,有必要获得服务的名称并执行:

sc停止ServiceName

查找哪个进程正在侦听端口: 如何找出哪个进程正在侦听Windows上的一个端口?

杀死它: 任何方式来写一个Windows .bat文件来杀死进程?

只是为了完成:

我想杀死连接到特定端口的所有进程,但不是进程侦听

在端口9001的命令(在cmd shell中)是:

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

findstr

  • r是expression式,c是确切的链式匹配。
  • [] *是用于匹配空格

netstat

  • 一个 – >全部
  • n – >不解决(更快)
  • o – > pid

它的工作原理是netstat打印出源端口,目标端口,然后打印出ESTABLISHED

与Merlyn的回应类似,但是这个也处理这些情况:

  • 端口号实际上是另一个较长端口号的左侧子string,您不需要。 你想search一个确切的端口号,这样你就不会杀死一个随机的,无辜的过程!
  • 脚本代码需要能够运行多次,并且每次都是正确的,而不是显示较老的,不正确的答案。

这里是:

 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. ) 

脚步:

  1. 去你的Apache Tomcat服务器的conf文件夹。 在我的情况下,它的apache-tomcat-7.0.61\conf因为我使用apache-tomcat-7.0.61

  2. 打开server.xml并根据需要将端口号从8080更改为任何其他端口。 例如:8081,8082,8087等

  3. 现在进入bin文件夹并运行shutdown.bat

  4. 现在通过eclipse重新启动服务器。

现在您的项目将不会中断。

如果有人正在寻找一个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) } } 

这个函数基本上做了上述function,但它是Powershell脚本格式,所以你可以把它添加到你的Powershellconfiguration文件中。 要find您的configuration文件的位置去powershell键入echo $profile

如果你想杀死在8080端口上侦听的进程,你可以使用PowerShell。 只需将Get-NetTCPConnection cmdlet与Stop-Process组合起来Get-NetTCPConnection

经过testing,应该可以在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"):