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

时间:2012-03-24 23:26:40

标签: unix port freebsd pid

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

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

8 个答案:

答案 0 :(得分:133)

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

lsof -i:80 -t

答案 1 :(得分:115)

-p的{​​{1}}标志为您提供过程的PID:

netstat

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

sockstat

答案 2 :(得分: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

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

答案 3 :(得分:9)

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

答案 4 :(得分:3)

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

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

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

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

答案 5 :(得分: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""

答案 6 :(得分:0)

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

答案 7 :(得分:0)

语法:

  

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

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

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

在Ubuntu中测试。