如何在Bash中关闭TCP端口16969?

16

我有一个使用TCP端口16969的应用程序。有时需要快速进行软件内核重新启动。但是,如果我启动得太快,就会被锁定并出现以下错误:

Exception in thread "main" java.net.BindException: Address already in use

因此,我想触发我的Bash脚本,该脚本可以杀死任何运行或监听16969端口的进程,但我该如何做?

$ lsof -w -n -i tcp:16969 # this gives me a list of 50 lines but how can I kill them all?
4个回答

23

你尝试过使用tcpkill吗?

示例:

tcpkill -i eth0 port 21

5
tcpkill 可以终止网络流,但不会终止绑定到该端口的进程。 - James C
7
考虑到问题存在歧义,这似乎是一个合理的解决方案。 - belacqua
1
这比杀死进程更好。当有太多请求时,我不想杀死我的Web服务器。 - Sridhar Sarnobat
2
当您希望进程继续进行时,这是完美的解决方案。 - machineaddict
此解决方案需要 root 权限。 - ks1322

19
我认为:
lsof -i tcp:22 | grep LISTEN | awk '{print $2}' | xargs kill

这应该能解决问题。

在执行 kill 命令之前,可以添加一个 echo 来确认它要运行的命令,像这样:

lsof -i tcp:22 | grep LISTEN | awk '{print $2}' | xargs echo kill

然后它将列出通常会杀死的PID。


1
@jordanm 不是这样的。如果没有使用 grep LISTEN,你会尝试杀死列标题,例如 PID - dmvianna
5
“awk '/LISTEN/ { print $2 }'” 这个命令的意思是在文本中查找包含“LISTEN”的行,并输出该行的第二个单词。awk 命令可以完成所有 grep 命令可以完成的任务,因此这个命令是多余的。 - jordanm
这会终止进程还是仅断开连接? - Kanagavelu Sugumar

18
fuser -k 16969/tcp 

可以释放该端口。这是一个有用的命令,可以用于关闭任何端口。


11
请注意,这将会终止与指定端口相关联的进程! - 19h
fuser命令可以杀死进程,但并没有最好的方法来关闭sockets。 - jedijs

5

我经常在Netbeans中使用JBoss时遇到这个问题...

我的解决方案:

在终端中输入:

 sudo netstat -lnp | grep 8080  

然后它会显示类似于:
 tcp6       0      0 :::8080       :::*        LISTEN      1722/java

然后使用:

 kill 1722  //replace 1722 by the PID you found.

希望这能有所帮助!

这是CentOS的解决方案。 - cwfighter
2
这将终止进程 :( - Kanagavelu Sugumar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接