windows – 通过从.BAT查找正在使用的端口来终止进程
最近要在内网的windows系统上部署公司的网站服务器,因为用的是jinkens,都自动化了,碰到个问题就是定时拉取服务器的代码重新运行,需要关闭已经运行的服务器程序,一般都是通过端口号获取进程id,再杀掉,不过windows上没搞过,好在已经有人做过了,转载一下,作为收藏了。
在Windows中,什么可以寻找端口8090,并尝试杀死它通过.BAT文件使用的进程?
1、正常情况下,我们会这样做,打开cmd窗口,
输入
netstat -a -n -o | findstr :8090
查找一下8090端口的进程,之后获取进程好 2044 。再次向taskkill结束进程
taskkill /pid 2044 -t -f
然后就结束进程了。
但是这样做有一个缺点,需要执行两条命令,因为每次程序启动的pid号码都是不一样的。而且需要人为的去填写进程pid号码,有没有更方便的方式呢,自动执行呢。
2、 这就需要用到for方法了
FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :8090') DO TaskKill.exe /PID %P -t -f
这样就结束了进程了,而且不需要分两次人工干预了。
FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :8090') DO echo TaskKill.exe /PID %P -t -f
添加一个echo可以显示命令
请注意,您可能需要为不同的操作系统略有更改。例如,在Windows 7或者Windows10上,您可能需要tokens = 5而不是tokens = 4。
3、进阶
如果我需要结束不止一个端口呢,难道问命令还需要写很多个吗?
其实很简单,只要把port设置成变量即可
set port=8090 8080
FOR /F "tokens=1-5 delims= " %P IN ('netstat -a -n -o ^| findstr ":%port%"') DO TaskKill.exe /PID %P -t -f
@echo off
set port=20812
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%port%"') do (
echo kill the process %%m who use the port %port%
taskkill /pid %%m
)
循环读取一批端口,并查询对应PID是否存在,若存在则关闭,脚本如下:
@echo off
for /l %%n in (20801,1,20812) do (
@echo find the process which use port [%%n]
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr ":%%n"') do (
tasklist /FI "PID eq %%m"|find /i "PID" && (
echo PID:%%m 运行中,kill the process [%%m] who use the port [%%n]
taskkill /F /pid %%m
) || echo PID:%%m 未运行
)
)
4、注意事项:
运行
FOR /F "tokens=5 delims= " %P IN ('netstat -a -n -o ^| findstr :8090') DO TaskKill.exe /PID %P -t -f
发现虽然可以关闭进程,但是那个dos黑窗口还在,这个关不掉,原因是,我是直接 win+r键,然后输入cmd,然后输入命令脚本运行程序的。
如果我把运行程序的脚本写成bat脚本,然后直接双击运行,这样的情况,就可以关闭进程的同时又关闭那个doc黑框了。
5 、原理:
FOR /F ... %variable IN ('command') DO otherCommand %variable...
这使您可以执行命令,并在其输出上循环。每行都将填充到%变量,并可以扩展到otherCommand任意多次,你喜欢,无论你喜欢什么。 %变量在实际使用中只能有一个单字母的名称,例如。 %V。
"tokens=4 delims= "
这允许你用空格分隔每一行,并取第四个块,并将它填充到%变量(在我们的例子中,%% P)。 delims看起来空的,但是额外的空间实际上是重要的。
netstat -a -n -o
只是运行它,找出来。根据命令行帮助,它“显示所有连接和侦听端口”,“以数字形式显示地址和端口号”和“显示与每个连接相关的拥有进程ID”。我只是使用这些选项,因为有人建议它,它碰巧工作:)
^|
这取得第一个命令或程序(netstat)的输出,并将其传递到第二个命令程序(findstr)。如果你直接在命令行中使用它,而不是在命令字符串中,你可以使用|而不是^ |。
findstr :8090
这将过滤传递给它的任何输出,只返回包含以下内容的行:8080。
TaskKill.exe /PID
这将使用进程ID杀死正在运行的任务。
%%P instead of %P
这在批处理文件中是必需的。如果在命令提示符下执行此操作,您将使用%P。