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

在 Windows 中,什么可以查找端口8080并尝试通过。BAT 文件?

336699 次浏览

这里有一个命令可以帮助你开始:

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

注意,对于不同的操作系统,您可能需要稍微改变一下这一点。例如,在 Windows7上,您可能需要 tokens=5而不是 tokens=4

这是怎么回事

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

这使您可以执行 command,并在其输出上循环。每一行将被塞进 %variable,并可以在 otherCommand扩展多少次,只要你喜欢,无论你喜欢。实际使用中的 %variable只能有一个单字母名称,例如 %V

"tokens=4 delims= "

这使您可以通过空格分割每一行,获取该行中的第4块,并将其填充到 %variable中(在我们的示例中为 %%P)。delims看起来是空的,但是这个额外的空间实际上很重要。

netstat -a -n -o

查查就知道了。根据命令行 help,它“显示所有连接和侦听端口”“以数字形式显示地址和端口号”以及“显示与每个连接关联的所属进程 ID”.我只是使用了这些选项,因为有人提出了这个建议,而这个建议恰好起作用了:)

^|

这将获取第一个命令或程序(netstat)的输出,并将其传递给第二个命令程序(findstr)。如果您直接在命令行中使用它,而不是在命令字符串中,那么您将使用 |而不是 ^|

findstr :8080

这会过滤传递给它的任何输出,只返回包含 :8080的行。

TaskKill.exe /PID <value>

这将使用进程 ID 终止正在运行的任务。

%%P instead of %P

这在批处理文件中是必需的。

和 Merlyn 的反应相似,但这个也能处理这些案子:

  • 端口号实际上是另一个较长端口的左子字符串 您要搜索的不是您要查找的号码 确切的 端口号,这样您就不会杀死一个随机的、无辜的进程!
  • 脚本代码需要能够运行不止一次,并且每次都是正确的,不显示旧的,不正确的 答案。

这就是:

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

谢谢大家,只是添加一些进程不会关闭,除非/F 强制开关也随任务杀死发送。 还有/T 开关,进程的所有辅助线程都将关闭。

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

对于服务,需要获取服务的名称并执行:

服务名称

使用 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

仅供参考:

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

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

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

返回文章页面

  • R 表示表达式,c 表示精确匹配的链。
  • 是用来配对空格的[也有空格的意思]

Netstat :

  • 全部
  • N-> 不要解析(更快)
  • O-> pid

它之所以能够工作,是因为 netstat 打印出源端口、目标端口和 ESTABLISHED

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

 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

步骤:

  1. 转到 阿帕奇公猫服务器的 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)
}
}

这个函数基本上和上面的函数一样,但是它是 Powershell 脚本格式的,所以你可以把它添加到你的 Powershell 配置文件中。要找到您的配置文件的位置,转到 powershell 并键入 echo $profile

如果要终止监听端口8080的进程,可以使用 PowerShell。只需将 Get-NetTCPConnection cmdlet 与 Stop-Process结合起来。

经过测试,应该可以在 Windows10或 WindowsServer2016上使用 PowerShell5。但是,我想它也应该可以在安装了 PowerShell 5的旧版本上运行。

这里有一个例子:

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

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

netstat -ano | findstr 8080

在这里,21424是进程 ID

taskkill /pid 21424 /F

要列出在端口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

将其粘贴到命令行中

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

如果您想在批处理中使用它,则使用 %%P代替 %P

创建了一个包含以下内容的 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

最后点击“回车”退出。