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

问题描述 投票:89回答:8

正如标题所说,我正在运行多个游戏服务器,并且每个都有相同的name但不同的PIDport数字。我想匹配正在侦听某个端口的服务器的PID,然后我想杀死这个进程。我需要它来完成我的bash脚本。

这甚至可能吗?因为它没有在网上找到任何解决方案。

unix port freebsd pid
8个回答
116
投票

-pnetstat标志为您提供过程的PID:

netstat -l -p

编辑:在FreeBSD中获取套接字用户的PID所需的命令是sockstat。正如我们在与@Cyclone的讨论中所做的那样,完成这项工作的路线是:

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

133
投票

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

lsof -i:80 -t

14
投票

netstat -p -l | grep $PORTlsof -i :$PORT解决方案很好,但我更喜欢fuser $PORT/tcp扩展语法到POSIX(适用于coreutils)和管道:

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

此外,-k由FreeBSD支持:http://www.freebsd.org/cgi/man.cgi?query=fuser


9
投票

netstat -nlp应该告诉你在哪个端口上监听的PID。


3
投票

我想以编程方式 - 仅使用Bash - 杀死侦听给定端口的进程。

假设端口是8089,那么我就是这样做的:

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

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


2
投票

由于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""

1
投票

在Windows上,获取pid的netstat选项是-o和-p选择协议过滤器,例如:netstat -a -p tcp -o


0
投票

句法:

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

示例:要终止在端口4200上运行的进程,请运行以下命令

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

在Ubuntu中测试过。

© www.soinside.com 2019 - 2024. All rights reserved.