如何写一个shscript来杀死-9一个通过lsof -i找到的pid

我正在使用tomcat,有时当我告诉它停止时它没有正确地杀死进程。

我也是这样做的:

lsof -i tcp:8080 

哪个输出:

 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 888 root 35u IPv6 780659 0t0 TCP *:http-alt (LISTEN) java 888 root 39r IPv6 790103 0t0 TCP localhost:58916->localhost:http-alt (CLOSE_WAIT) java 888 root 40r IPv6 792585 0t0 TCP localhost:58936->localhost:http-alt (CLOSE_WAIT) java 888 root 75r IPv6 785553 0t0 TCP localhost:58701->localhost:http-alt (CLOSE_WAIT) java 888 root 77r IPv6 787642 0t0 TCP localhost:58814->localhost:http-alt (CLOSE_WAIT) java 888 root 130u IPv6 783894 0t0 TCP localhost:58686->localhost:http-alt (CLOSE_WAIT) java 888 root 353u IPv6 780929 0t0 TCP localhost:58632->localhost:http-alt (CLOSE_WAIT) 

然后我跑了

 kill -9 pid 

我想要一种方法来获取所有的pid数字并杀死它们。 事情是我不知道如何隔离那个领域。

lsof有一个-t (简洁)选项,它似乎完全符合您的要求,即

 $ sudo lsof -ti tcp:80 1387 4538 4539 

man lsof

 -t specifies that lsof should produce terse output with process identifiers only and no header - eg, so that the output may be piped to kill(1). -t selects the -w option. 

假设您具有必要的权限,则可以将结果作为带有命令替换的PID列表传递给kill

 kill -9 $(lsof -ti tcp:80) 

lsof -i tcp:8080产生输出,然后是| egrep -v "COMMAND PID USER" | egrep -v "COMMAND PID USER"删除标题行,然后| awk '{print $2}' | awk '{print $2}'打印第二个字段, | sort -n | sort -n准备| uniq的数字 | uniq ,只输出一次唯一的PID。 把它们放在一起给出了:

  lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq 

但是, pkill -KILL tomcatkillall -KILL tomcat更容易。

别忘了kill--no-run-if-empty选项:)

 lsof -ti :8080 | xargs --no-run-if-empty kill -9 

那种方式只会在有一个进程监听时运行kill ,而不需要自己进行检查。

来自@waltinator的一个class轮很棒。

我会为它添加更多的味道:

 lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq | xargs kill -9 

要么

 kill -9 $(lsof -i tcp:8080 | egrep -v "COMMAND PID USER" | awk '{print $2}' | sort -n | uniq) 

注意:这仍然是非常基本的,您可能需要添加更多的盐和胡椒,以使其在真实环境中更加健壮。

这是我想出了一些错误检查的脚本。

 #!/bin/bash PORT=$1 if ! [[ "$PORT" =~ ^[0-9]+$ ]] ; then printf "error: '$PORT' is not a number.\n\nUsage killport \n" exit 1 fi PID=$(lsof -ti:$PORT) if ! [[ "$PID" =~ ^[0-9]+$ ]] ; then printf "no proccess found, nothing to kill.\n" exit 0 fi printf "killing process $PID running on $PORT\n" kill -9 $PID 

这是一个简单的鱼壳function

 function kill-port set pids (lsof -ti tcp:$argv) if test $pids kill -9 $pids else echo "No proccesses on that port to kill to see for your self -- lsof -i tcp:$argv" end end 

只需将这个吸盘粘在这个位置的文件~/.config/fish/functions/kill-port.fish就可以了。 您可以像kill-port 8000一样调用它