我经常这样做
sudo netstat -lpn |grep :8088
查看输出
tcp6 0 0 :::8088 :::* LISTEN 11189/java
进而
sudo kill -kill 11189
我希望有一个更方便的命令,就像killatport 8088
使用 tcp 端口号作为变量,我可以将其作为管道的别名来执行我想要的操作,但是如何从输出中获取 PID 并将其通过管道传输到 kill 命令?我想我可以使用 awk 从 netstat 的输出中获取 PID,但是如何保护并进行精确的端口匹配,以便输入 80 不会匹配 8080 等等?我应该把它做成 C 程序吗?或者已经有这样的小工具了?
答案1
定影器可以这样做:
sudo fuser -KILL -k -n tcp 8088
答案2
命令可以表述如下:
netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
解释:
netstat -ltpn
l
列出了TCP () 上的监听端口 ( )t
及其程序 (p
),但不将端口号解析为名称 (n
)。
grep ":1234\b"
- 这将搜索后面
:1234
跟有边界 (\b
) 的单词(或数字,在我们的例子中)的结尾。这确保我们不会捕获:12345
示例。
- 这将搜索后面
awk '{sub(/\/.*/, "", $NF); print $NF}'
这
- 替代品
sub(/regex/,"replacewith", #fieldnumber)
- 这个正则表达式
\/.*
- 一无所有
""
- 在字段 中
$NF
,表示最后一个字段(即包含 的字段PID/program
) - 然后打印它
print $NF
。
正则表达式
\/.*
匹配文字/
及其后面的所有内容,然后我们用任何内容替换它,本质上是删除它,因此该字段中只剩下 PID 号码。- 替代品
xargs -i kill -kill {}
xargs -i
是一个程序,它允许你将前一个命令的输出作为另一个命令的输入。我们的命令是,kill -kill {}
其中{}
表示“管道中前一个命令的输出”,即我们的 PID 编号。
笔记:整个命令可能有点危险,因为您可能会意外地杀死一些您不想要的东西。它可以再多一点净化。只需确保在使用它时获得正确的端口号即可。
如果您想将其变成一个函数,您可以将以下内容添加到您的~/.bashrc
:
killatport(){
netstat -lpn | grep ":$1\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}
}
使用 保存并应用更改source ~/.bashrc
。现在,您可以像这样使用该函数:
killatport 8088