134

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

4

13 回答 13

197

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

 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

于 2015-06-08T07:11:37.820 回答
150

这是一个帮助您入门的命令:

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改为使用。

于 2011-06-01T16:13:30.967 回答
55

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

netstat -ano | findstr 8080

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

taskkill /pid 21424 /F 
于 2017-01-17T13:17:00.133 回答
22

使用 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
于 2013-12-17T15:09:42.293 回答
19

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

网络统计-ano | 找到“8080”

TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       10612

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

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

taskkill /F /PID 10612

于 2017-05-19T04:10:31.550 回答
15

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

于 2012-11-19T11:38:22.850 回答
6

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

于 2019-04-01T20:07:53.190 回答
2

只是为了完成:

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

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

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

查找字符串

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

网络统计

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

它之所以有效,是因为 netstat 打印出源端口,然后是目标端口,然后是 ESTABLISHED

于 2014-07-01T08:42:35.650 回答
1

如果要终止正在侦听端口 8080 的进程,可以使用 PowerShell。只需将Get-NetTCPConnectioncmdlet 与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"):
于 2016-11-02T19:32:28.187 回答
0

与 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.
)
于 2012-11-13T21:21:57.777 回答
0

脚步:

  1. 转到您的apache tomcat服务器conf的文件夹。就我而言,它就像我使用 apache-tomcat-7.0.61apache-tomcat-7.0.61\conf

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

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

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

现在您的项目将不间断地工作。

于 2015-07-12T14:04:42.520 回答
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

于 2016-04-11T21:46:52.270 回答
0

将此粘贴到命令行中

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

如果您想在批处理 pu 中使用它%%P而不是%P

于 2018-02-12T22:10:57.360 回答