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

Posted

技术标签:

【中文标题】通过从 .BAT 中查找正在使用的端口来终止进程【英文标题】:Kill a Process by Looking up the Port being used by it from a .BAT 【发布时间】:2011-09-06 10:27:03 【问题描述】:

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

【问题讨论】:

我可以带你去那里的一部分......从命令提示符使用命令'netstat -a -n -o',你会看到一个进程列表以及它们正在侦听的端口on(以及ip以及它们是否连接到另一个IP..)非常宝贵。几乎可以肯定会有更好的开关来改进结果,但我不记得它们了...希望有人可以在此基础上进行改进? 在linux中可以。如果你安装 cygwin,你也可以在 bat 中使用 @Dani, Mike:Cygwin 是一个巨大的依赖项,不需要解决这个问题。但是,如果您已经拥有它,请使用它 - linux 命令行工具要好得多。 【参考方案1】:

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

 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

【讨论】:

是的,各地都会有所不同 非常有用!请注意,我搜索的是 :3000 而不是 0.0:3000,因为它可能低于 127.0.01 而不是 0.0.0.0 谢谢,干得好,干掉了一个失控的 webpack 开发任务 :) 或者您可以简单地提供 netstat -ano | findstr :9797 taskkill /PID typeyourPIDhere /F 这里 9797 是端口号,我经常使用这个命令来杀死行为不端/挂起的服务器。【参考方案2】:

这里有一个命令让你开始:

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

请注意,您可能需要针对不同的操作系统稍作更改。例如,在 Windows 7 上,您可能需要 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

只需运行它并找出答案。根据命令行帮助,它“显示所有连接和侦听端口。”、“以数字形式显示地址和端口号。”和“显示与每个连接关联的拥有进程 ID。”。我只是使用这些选项,因为其他人建议它,而且它碰巧工作:)

^|

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

findstr :8080

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

TaskKill.exe /PID <value>

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

%%P instead of %P

这在批处理文件中是必需的。如果您在命令提示符下执行此操作,您将改用 %P

【讨论】:

您可能需要使用令牌、delims 等。在命令行上查看HELP FOR 以查看FOR 将为您提供的许多其他选项,并查看netstat -?、@ 987654351@ 和 TaskKill /? 以获得更多帮助。 我会尝试并回复您。 FOR /F "tokens=5 delims=" %%P IN ('netstat -a -n -o ^| findstr :8080') DO TaskKill.exe /F /PID %%P 这很棒。我认为tokens=4 是Windows XP 和tokens=5 Windows 7。/F 强制杀死也是一个好主意。 @MerlynMorgan-Graham 因为这是一个公认的答案,请考虑从***.com/a/20637662/5243762 这个答案中添加积分【参考方案3】:

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

netstat -ano | findstr 8080

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

taskkill /pid 21424 /F 

【讨论】:

@EralpB 享受 :)【参考方案4】:

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

【讨论】:

我收到了%%P was unexpected at this time. 有什么建议吗?【参考方案5】:

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

【讨论】:

【参考方案6】:

谢谢大家,只是补充一点,除非 /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 停止服务名称

【讨论】:

在 Windows 10 上运行良好!【参考方案7】:

创建了一个包含以下内容的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 脚本,而不是 shell 脚本【参考方案8】:

只是为了完成:

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

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

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

findstr

r 用于表达式,c 用于精确匹配链。 [ ]* 用于匹配空格

网络统计

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

因为 netstat 会打印出源端口,然后是目标端口,然后是 ESTABLISHED,所以它可以工作

【讨论】:

【参考方案9】:

如果您想终止正在侦听端口 8080 的进程,您可以使用 PowerShell。只需将Get-NetTCPConnection cmdlet 与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"):

【讨论】:

【参考方案10】:

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

【讨论】:

【参考方案11】:

步骤:

    转到 apache tomcat 服务器的 conf 文件夹。就我而言,它是apache-tomcat-7.0.61\conf,因为我正在使用 apache-tomcat-7.0.61

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

    现在转到bin 文件夹并运行shutdown.bat

    现在通过 eclipse 重启服务器。

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

【讨论】:

【参考方案12】:

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

【讨论】:

这并不是一个真正的 PowerShell 脚本,而是一个基于 PowerShell 的 netstat 工具的包装器。【参考方案13】:

粘贴到命令行

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

如果你想批量使用%%P而不是%P

【讨论】:

这取决于操作系统的语言,有什么办法让它适用于所有语言? @Jakob 这只能在 Windows 的 cmd 终端中运行,也只能在 .cmd 或 .bat 文件中运行 是的,但仅限英文,否则“LISTENING”将被翻译成操作系统的语言。 @Jakob 我不知道netstat 工具被翻译成其他语言

以上是关于通过从 .BAT 中查找正在使用的端口来终止进程的主要内容,如果未能解决你的问题,请参考以下文章

通过从 sql server 加入表来更新访问表

通过从文件中读取值来计算移动平均值

通过从上到下滚动表格来刷新 UITable 内容

通过从文件中读取来提升正则表达式匹配

通过从perl脚本调用的批处理文件设置环境变量

如何通过从数据库中检索值来显示文本框中的值?