【发布时间】:2012-04-09 00:56:57
【问题描述】:
正如标题所说,我正在运行多个游戏服务器,每个服务器都有相同的name,但PID 和port 编号不同。我想匹配正在侦听某个端口的服务器的PID,然后我想终止这个进程。我需要它来完成我的 bash 脚本。
这可能吗?因为它还没有在网上找到任何解决方案。
【问题讨论】:
正如标题所说,我正在运行多个游戏服务器,每个服务器都有相同的name,但PID 和port 编号不同。我想匹配正在侦听某个端口的服务器的PID,然后我想终止这个进程。我需要它来完成我的 bash 脚本。
这可能吗?因为它还没有在网上找到任何解决方案。
【问题讨论】:
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
netstat 被调用。它有其他语法。
语法:
kill -9 $(lsof -t -i:portnumber)
例子: 要杀死在端口 4200 上运行的进程,请运行以下命令
kill -9 $(lsof -t -i:4200)
在 Ubuntu 中测试。
【讨论】:
在 Windows 上,获取 pid 的 netstat 选项是 -o 并且 -p 选择协议过滤器,例如: netstat -a -p tcp -o
【讨论】:
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
【讨论】:
我想以编程方式——仅使用 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
由于 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""
【讨论】:
可以传递给 kill 命令的短版本:
lsof -i:80 -t
【讨论】:
lsof -i4TCP:80 -sTCP:LISTEN -t 可能是您想要的。
kill -9 `lsof -i:80 -t` 方便复制
netstat -nlp 应该告诉你监听哪个端口的 PID。
【讨论】:
netstat: 80: unknown or uninstrumented protocol 使用80 (nginx) 端口进行测试。没用。