Oneliner命令使用kill给定的TCP端口号代替PID?


8

我经常做

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
使用SIGKILL通常不是一个好主意。您为什么不希望该过程自行清理?
盖尔哈2014年

mvn jetty:stop如果实例具有,则停止服务器可能会失败OutOfMemoryError。当我重新启动Java servlet时,碰巧该端口即使在常规停止(例如)时也不可用mvn jetty:stop。有时,该进程OutOfMemoryError在正常关闭(例如)时可以获取或不能释放TCP端口mvn jetty:stop
Niklas 2014年

1
尽管如此,mvn jetty:stop它与发送SIGTERM还是不同的,即使它的应用程序不在内存中,jvm也应该能够处理SIGTERM。
盖尔哈2014年

Answers:



2

可以这样编写命令:

netstat -lpn | grep ":1234\b" | awk '{sub(/\/.*/, "", $NF); print $NF}' | xargs -i kill -kill {}

说明:

  1. netstat -ltpn

    • 这列出了lTCP ()上的侦听端口()t及其程序(p),而没有将端口号解析为名称(n)。
  2. grep ":1234\b"

    • 这将搜索:1234后跟一个边界(\b),以指示单词(或本例中的数字)的结尾。这确保了我们不会被抓住:12345
  3. awk '{sub(/\/.*/, "", $NF); print $NF}'

    • 这个

      • 替代品 sub(/regex/,"replacewith", #fieldnumber)
      • 这个正则表达式 \/.*
      • 一无所有 ""
      • 在字段中$NF,表示最后一个字段(即包含的字段PID/program
      • 然后打印出来print $NF

      正则表达式\/.*匹配一个文字/及其后的所有内容,然后我们将其替换为空,本质上将其删除,因此在该字段中仅保留PID编号。

  4. 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.