通过从.BAT中查找正在使用的端口来终止进程
在Windows中,可以查找端口8080并尝试通过.BAT文件终止正在使用的进程?
这是一个让你开始的命令:
FOR /F "tokens=4 delims= " %%P IN ('netstat -a -n -o ^| findstr :8080') DO @ECHO TaskKill.exe /PID %%P
如果您对batch file有信心,请删除@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= "
这可以让你用空格分割每一行,然后取第四行,并将其填入%variable
(在我们的例子中为%%P
)。 delims
看起来是空的,但是额外的空间实际上是很重要的。
netstat -a -n -o
只要运行一下,找出来。 根据命令行帮助,它显示“显示所有连接和侦听端口”,“以数字forms显示地址和端口号”,以及“显示与每个连接关联的拥有进程ID”。 我刚刚使用这些选项,因为别人build议,而且恰巧工作:)
^|
这需要第一个命令或程序( netstat
)的输出,并将其传递到第二个命令程序( findstr
)。 如果您直接在命令行中使用此命令,而不是在命令string中,则可以使用|
而不是^|
。
findstr :8080
这将筛选传入的所有输出,仅返回包含:8080
行:8080
。
TaskKill.exe /PID <value>
这会使用进程ID来杀死正在运行的任务。
%%P instead of %P
这在batch file中是必需的。 如果您在命令提示符下执行了此操作,则可以使用%P
。
打开命令提示符并运行以下命令
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
要查找命令行上的特定进程,请使用下面的命令8080是进程使用的端口
netstat -ano | findstr 8080
杀死进程使用下面的命令这里21424是进程ID
taskkill /pid 21424 /F
使用Merlyn的解决scheme导致其他应用程序像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
要列出在端口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
谢谢大家,只是添加一些过程将不会closures,除非/ F的强制开关也发送TaskKill。 同样用/ T开关,进程的所有辅助线程将被closures。
C:\>FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :2002') DO TaskKill.exe /PID %P /T /F
对于服务,有必要获得服务的名称并执行:
sc停止ServiceName
查找哪个进程正在侦听端口: 如何找出哪个进程正在侦听Windows上的一个端口?
杀死它: 任何方式来写一个Windows .bat文件来杀死进程?
只是为了完成:
我想杀死连接到特定端口的所有进程,但不是进程侦听
在端口9001的命令(在cmd shell中)是:
FOR /F "tokens=5 delims= " %P IN ('netstat -ano ^| findstr -rc:":9001[ ]*ESTA"') DO TaskKill /F /PID %P
findstr :
- r是expression式,c是确切的链式匹配。
- [] *是用于匹配空格
netstat :
- 一个 – >全部
- n – >不解决(更快)
- o – > pid
它的工作原理是netstat打印出源端口,目标端口,然后打印出ESTABLISHED
与Merlyn的回应类似,但是这个也处理这些情况:
- 端口号实际上是另一个较长端口号的左侧子string,您不需要。 你想search一个确切的端口号,这样你就不会杀死一个随机的,无辜的过程!
- 脚本代码需要能够运行多次,并且每次都是正确的,而不是显示较老的,不正确的答案。
这里是:
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. )
脚步:
-
去你的Apache Tomcat服务器的
conf
文件夹。 在我的情况下,它的apache-tomcat-7.0.61\conf
因为我使用apache-tomcat-7.0.61 -
打开
server.xml
并根据需要将端口号从8080更改为任何其他端口。 例如:8081,8082,8087等 -
现在进入
bin
文件夹并运行shutdown.bat
-
现在通过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) } }
这个函数基本上做了上述function,但它是Powershell脚本格式,所以你可以把它添加到你的Powershellconfiguration文件中。 要find您的configuration文件的位置去powershell键入echo $profile
如果你想杀死在8080端口上侦听的进程,你可以使用PowerShell。 只需将Get-NetTCPConnection
cmdlet与Stop-Process
组合起来Get-NetTCPConnection
。
经过testing,应该可以在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"):