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


29

我正在使用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
如果您确定只tomcat打开一个进程,则可以使用killall -9 tomcat
Joseph R.

Answers:


57

中有一个-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)

您现在已经回答了我问过的两个问题;-)
user2757729 2013年

3

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

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

这样一来,kill只会在有一个进程监听的情况下运行,而无需自己进行检查。


“--no -运行-如果空”在BSD(MAC)不支持
迪内希ygv

1

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比较容易。


Tomcat进程未命名为“ tomcat”就是问题所在。这只是一个普通的Java进程,如果同时有其他Java进程在运行,则必须做额外的工作才能确定正确的进程。
Terry Wang

@TerryWang是,这也是我的问题。Steeldriver的答案非常有用。
user2757729 2013年

0

@waltinator的那一支班轮很棒。

我将为其添加更多风味:

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)

注意:这仍然是非常基本的,您可能需要添加更多的盐和胡椒粉才能使其在实际环境中更坚固。


0

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

#!/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

0

这是一个简单的鱼壳功能

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

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.