确定监听某个端口的进程pid
Posted
技术标签:
【中文标题】确定监听某个端口的进程pid【英文标题】:Determine the process pid listening on a certain port 【发布时间】:2012-04-09 00:56:57 【问题描述】:正如标题所说,我正在运行多个游戏服务器,每个服务器都有相同的name
,但PID
和port
编号不同。我想匹配正在侦听某个端口的服务器的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 $PORT
和 lsof -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干货盘点#