无法在 bash 脚本上运行“taskkill”,但可以从 cygwin 运行

无法在 bash 脚本上运行“taskkill”,但可以从 cygwin 运行

我有一个非常简单的 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可以输出例如LISTENINGpid您无法可靠地按照您的方式进行拆分之前。
结论2:您应该始终将单个值传递给taskkill,而不是多行字符串。

建议:UDP和进行区分TCP,因为TCP连接有一STATUS列:

PID_NUMBER=$(netstat -a -n -o | grep :$1 | awk '/UDP/{a=$4} /TCP/{a=$5} END{print a}')

相关内容