我正在使用 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