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

Posted

技术标签:

【中文标题】确定监听某个端口的进程pid【英文标题】:Determine the process pid listening on a certain port 【发布时间】:2012-04-09 00:56:57 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

netstat-p 标志为您提供进程的 PID:

netstat -l -p

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

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

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

【讨论】:

netstat: 80: unknown or uninstrumented protocol 使用80 (nginx) 端口进行测试。没用。 改用netstat -nlp | grep :80 netstat: option requires an argument -- p @jasonbrittain 在 Cygwin 上,Windows 原生 netstat 被调用。它有其他语法。 这个答案是错误的:netstat: option requires an argument -- p【参考方案2】:

语法:

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

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

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

在 Ubuntu 中测试。

【讨论】:

【参考方案3】:

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

【讨论】:

【参考方案4】:

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

【讨论】:

让我们更加简洁明了【参考方案5】:

我想以编程方式——仅使用 Bash——终止侦听给定端口的进程。

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

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

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

【讨论】:

这是我用来执行此操作的函数:function kill-listener lsof -i:$1 -t | xargs kill -9 使用您的端口 8089 示例:kill-listener 8089【参考方案6】:

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

【讨论】:

【参考方案7】:

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

lsof -i:80 -t

【讨论】:

这还包括在该端口上连接的进程。 lsof -i4TCP:80 -sTCP:LISTEN -t 可能是您想要的。 正是我想要的。我想通过搜索它正在运行的端口来终止一个进程。 @Nevir “还包括连接在该端口上的进程”是什么意思?你能解释一下吗? kill -9 `lsof -i:80 -t` 方便复制【参考方案8】:

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

【讨论】:

netstat: 80: unknown or uninstrumented protocol 使用80 (nginx) 端口进行测试。没用。

以上是关于确定监听某个端口的进程pid的主要内容,如果未能解决你的问题,请参考以下文章

异常剖析 - netstat查看进程时不显示进程名pid 显示"-" #yyds干货盘点#

Linux,deian 7怎么把占用80端口的程序kill掉

什么进程正在监听 Solaris 上的某个端口?

如何以编程方式获取正在侦听某个端口的进程的 pid?

如何获取进程监听的端口?

java 用ServerSocket监听了一个端口,在程序结束的