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


128

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


我可以帮助您...从命令提示符处使用命令'netstat -a -n -o',您将看到进程列表以及它们正在侦听的端口(以及ip以及是否它们是否已连接到另一个IP。)几乎肯定会有更好的开关来完善结果,但我记不起来了……希望有人可以以此为基础吗?
戴夫

在linux中可以。如果您安装cygwin,也可以使用bat
Dani

@Dani,迈克:Cygwin是一个巨大的依赖,不需要解决这个问题。但是,如果已经有了它,请使用它-linux命令行工具要好得多。
Merlyn Morgan-Graham

Answers:


141

这是开始您的命令:

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 -?findstr /?以及TaskKill /?对甚至更多的帮助。
Merlyn Morgan-Graham

我会尝试的,并尽快回复您。
Mike Flynn

6
FOR / F“令牌= 5 delims =”“ %% P IN('netstat -a -n -o ^ | findstr:8080')DO TaskKill.exe / F / PID %% P
Mike Flynn

10
这很棒。tokens=4我认为是Windows XP和tokens=5Windows 7 /F
Strelok

1
@ MerlynMorgan -格雷厄姆,因为这是一个公认的答案,请考虑增加点stackoverflow.com/a/20637662/5243762这个答案以及
IAmSurajBobade

196

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

 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


是的,到处都将有所不同
Mohit Singh

3
很有用 !请注意,我搜索的是:3000而不是0.0:3000,因为它可能低于127.0.01而不是0.0.0.0
Leeeeeeelo 2016年

2
谢谢,出色的工作杀死了失控的webpack开发任务:)
danjah

或者,您可以只提供netstat -ano | findstr:9797 taskkill / PID typeyourPIDhere / F这里的9797是端口号,我经常使用此命令来杀死行为异常/挂起的服务器。
Mohit Singh,


19

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

18

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


13

谢谢大家,只是要补充一点,除非/ 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


2

只是为了完成:

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

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

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

findstr

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

netstat

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

之所以有效,是因为netstat先打印出源端口,然后输出目标端口,然后再建立


2

使用以下内容创建了一个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脚本
Sireesh Yarlagadda

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

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

0

脚步:

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

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

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

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

现在,您的项目将正常运行。


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


1
这实际上不是PowerShell脚本,而是围绕netstat工具的基于PowerShell的包装器。
bahrep

0

将此粘贴到命令行

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

如果要在批处理中使用pu %%P而不是%P


这取决于操作系统的语言,是否有使其适用于所有语言的方法?
雅各布

@Jakob只能在Windows的cmd终端中运行,也只能在.cmd或.bat文件中运行
Eduard Florinescu

是的,但只能使用英语,否则“ LISTENING”将被翻译为操作系统的语言。
雅各布

@Jakob我不知道该netstat工具已翻译成其他语言
Eduard Florinescu

0

如果您按系统运行,则无法结束任务。试试这个命令

x:>净止损http / y


3
“如果您按系统”是什么意思?而且这个答案比其他所有答案都更好吗?
Nico Haase
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.