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

如何编写 shscript 来杀死通过 lsof -i 找到的 -9 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 编号并终止它们。问题是我不知道如何隔离该字段。

答案1

中有一个-t(简洁的)选项lsof,它似乎可以完成您正在寻找的任务,即

$ 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 - e.g., so that the output  may
         be piped to kill(1).  -t selects the -w option.

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

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

答案2

不要忘记--no-run-if-empty选择:)

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

那样只有在有进程监听的情况下才会运行,不需要自己检查。

答案3

lsof -i tcp:8080生成输出,然后| egrep -v "COMMAND PID USER"删除标题行,然后| awk '{print $2}'打印第二个字段,| sort -n准备数字| uniq,只输出每个唯一 PID 一次。将所有内容放在一起可得出:

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

但是,pkill -KILL tomcat或者killall -KILL tomcat更容易。

答案4

这是我经过一些错误检查后想出的脚本。

#!/bin/bash

PORT=$1

if ! [[ "$PORT" =~ ^[0-9]+$ ]] ;
then
  printf "error: '$PORT' is not a number.\n\nUsage killport <port number>\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

相关内容