我有一个非常简单的 Bash 脚本。此 Bash 脚本的目标是接收端口号参数,并终止在该端口上运行的所有进程。
#!/bin/bash
PID_NUMBER=$(netstat -a -n -b -o | grep $1 | sed -e "s/[[:space:]]\+/ /g" | cut -d ' ' -f5)
echo "$PID_NUMBER"
taskkill /F /PID "$PID_NUMBER"
但是,在 Cygwin 中运行 bash 脚本可以正确显示 PID_NUMBER,但在 taskkill 中会抛出“错误:查询无效”
输出:
$ ./KillProcessesAtPort.sh 546
1540
ERROR: Invalid query
如果我在 Cygwin 中运行“taskkill /F /PID 1540”,则该进程将成功终止。
$ taskkill /F /PID 1540
SUCCESS: The process with PID 1540 has been terminated.
我在 Windows 10 的 Cygwin 终端上运行此脚本。为什么我的脚本在执行 taskkill 时会抛出错误,而在 Cygwin 中执行 taskkill 却可以正常工作?
答案1
以下是对我有用的方法:
#!/bin/bash
PID_NUMBER=$(netstat -a -n -b -o | grep $1 | sed -e "s/[[:space:]]\+/ /g" | cut -d ' ' -f6 | head -1)
echo "$PID_NUMBER"
taskkill /F /PID "$PID_NUMBER"
注1:我必须用 来替换-f5
,-f6
因为否则我会得到不同的列。
笔记2: taskkill
当返回ERROR: Invalid query
多个时会失败。通过添加 解决。pid
| head -1
结论1:请注意,您的解决方案并不强大:因为netstat
可以输出例如LISTENING
在pid
您无法可靠地按照您的方式进行拆分之前。
结论2:您应该始终将单个值传递给taskkill
,而不是多行字符串。
建议:对UDP
和进行区分TCP
,因为TCP
连接有一STATUS
列:
PID_NUMBER=$(netstat -a -n -o | grep :$1 | awk '/UDP/{a=$4} /TCP/{a=$5} END{print a}')