shell脚本杀死侦听端口3000的进程?

时间:2012-02-06 22:37:42

标签: linux bash sockets kill

我想定义一个名为kill3000的bash别名来自动执行以下任务:

$ lsof -i:3000

COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
ruby    13402 zero    4u  IPv4 2847851      0t0  TCP *:3000 (LISTEN)

$ kill -9 13402

6 个答案:

答案 0 :(得分:104)

alias kill3000="fuser -k -n tcp 3000"

答案 1 :(得分:43)

试试这个:

    kill -9 $(lsof -i:3000 -t)

-t标志是你想要的:它显示PID,没有别的。

更新

如果找不到该进程,并且您不希望看到错误消息:

    kill -9 $(lsof -i:3000 -t) 2> /dev/null

假设您正在运行bash。

更新

Basile的建议非常好:我们应该首先尝试终止该过程 kill -TERM ,如果失败,那么 kill -KILL (AKA kill - 9 ):

    pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid

您可能希望将其设为bash函数。

答案 2 :(得分:9)

使用原始lsof命令的另一个选项:

lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9

如果要在shell脚本中使用它,可以将-r标志添加到xargs以处理没有进程正在侦听的情况:

... | xargs -r kill -9

答案 3 :(得分:3)

fuser -n tcp 3000

将产生

的输出
3000/tcp:     <$pid>

所以你可以这样做:

fuser -n tcp 3000 | awk '{ print $2 }' | xargs -r kill

答案 4 :(得分:3)

怎么样

alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9"

答案 5 :(得分:3)

fuser -k 3000/tcp也应该有用