确定监听某个端口的进程pid

108

正如标题所说,我正在运行多个游戏服务器,每个服务器都有相同的name但不同的PIDport号码。 我想要匹配监听某个端口的服务器的PID,然后我想杀死这个进程。 我需要这样做才能完成我的bash脚本。

这样做可能吗? 因为我在网上还没有找到任何解决方案。

8个回答

158

可以传递给kill命令的简短版本:

lsof -i:80 -t

13
这也包括在该端口上与之“连接”的进程。 lsof -i4TCP:80 -sTCP:LISTEN -t 可能是您想要的命令。 - Nevir
正是我想要的。我想通过搜索进程运行的端口来终止一个进程。 - mythicalcoder
@Nevir 你所说的“还包括在该端口上连接的进程”是什么意思?能否请你解释一下? - kishorer747
3
为了方便复制,请将以下文本翻译为中文:kill -9 \lsof -i:80 -t`` - bmjrowe

131

netstat-p 标志可以给出进程的 PID:

netstat -l -p

*如果显示-而不是PID,请使用sudo

编辑:在FreeBSD中获取套接字用户的PID所需的命令是sockstat。 正如我们在与@Cyclone的讨论中解决的那样,执行此任务的行是:

sockstat -4 -l | grep :80 | awk '{print $3}' | head -1

2
netstat: 80端口:未知或未被检测的协议,用于测试目的使用了80(nginx)端口。没有起作用。 - Cyclone
5
请尝试使用netstat -nlp | grep :80代替。该命令的意思是列出所有正在监听端口80的进程信息。 - stanwise
13
netstat命令:选项需要一个参数 -- p - Cyclone
2
@jasonbrittain 在Cygwin上,Windows本地的netstat被称为。它有其他语法。 - stanwise
2
这个答案是错误的:netstat: 选项需要一个参数 -- p - Good Person
显示剩余7条评论

17

fuser $PORT/tcp扩展语法对于管道操作更加优秀(适用于coreutils),因此我更喜欢它,虽然netstat -p -l | grep $PORTlsof -i :$PORT也是不错的解决方案。

pid=`fuser $PORT/tcp`

它会输出纯粹的 pid,所以你可以省略 sed 魔法。

fuser 工具让我爱不释手的一个原因是它可以直接向该进程发送信号(这种语法也是 POSIX 的扩展):

$ fuser -k $port/tcp       # with SIGKILL
$ fuser -k -15 $port/tcp   # with SIGTERM
$ fuser -k -TERM $port/tcp # with SIGTERM

FreeBSD也支持-k选项:http://www.freebsd.org/cgi/man.cgi?query=fuser


1
fuser更加整洁和简明。 - Dawoodjee

11

netstat -nlp 命令可以告诉你哪个进程在监听哪个端口。


2
netstat: 80端口:未知或未被检测的协议用于测试目的。测试未成功(nginx)。 - Cyclone

4

语法:

kill -9 $(lsof -t -i:端口号)

示例: 要杀死在端口4200运行的进程,请运行以下命令

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

在Ubuntu系统中测试通过。


3

由于我的计算机上没有原生安装sockstat,所以我修改了stanwise的答案,改用netstat代替。

netstat -nlp | grep -E "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\:2000" | awk '{print $7}' | sed -e "s/\/.*//g""

3

我希望通过Bash脚本实现杀掉监听在指定端口上的进程,且不需其他编程语言。这涉及到IT技术。

假设需要关闭8089端口,则以下是实现方法:

badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid

我希望这能帮助其他人!我知道它会帮助我的团队。

1
这是我用来执行此操作的函数: function kill-listener { lsof -i:$1 -t | xargs kill -9 } 使用您提供的端口8089的示例:kill-listener 8089 - Hurricane Hamilton

2

在Windows系统中,获取进程ID的netstat选项为-o,-p用于选择协议过滤器,例如: netstat -a -p tcp -o


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接