通过从 .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 中查找正在使用的端口来终止进程的主要内容,如果未能解决你的问题,请参考以下文章