正如标题所说,我正在运行多个游戏服务器,并且每个都有相同的name
但不同的PID
和port
数字。我想匹配正在侦听某个端口的服务器的PID
,然后我想杀死这个进程。我需要它来完成我的bash脚本。
这甚至可能吗?因为它没有在网上找到任何解决方案。
-p
的netstat
标志为您提供过程的PID:
netstat -l -p
编辑:在FreeBSD中获取套接字用户的PID所需的命令是sockstat
。正如我们在与@Cyclone的讨论中所做的那样,完成这项工作的路线是:
sockstat -4 -l | grep :80 | awk '{print $3}' | head -1
您可以传递给kill命令的简短版本:
lsof -i:80 -t
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
此外,-k由FreeBSD支持:http://www.freebsd.org/cgi/man.cgi?query=fuser
netstat -nlp
应该告诉你在哪个端口上监听的PID。
我想以编程方式 - 仅使用Bash - 杀死侦听给定端口的进程。
假设端口是8089,那么我就是这样做的:
badPid=$(netstat --listening --program --numeric --tcp | grep "::8089" | awk '{print $7}' | awk -F/ '{print $1}' | head -1)
kill -9 $badPid
我希望这有助于其他人!我知道它会帮助我的团队。
由于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""
在Windows上,获取pid的netstat选项是-o和-p选择协议过滤器,例如:netstat -a -p tcp -o
句法:
kill -9 $(lsof -t -i:portnumber)
示例:要终止在端口4200上运行的进程,请运行以下命令
kill -9 $(lsof -t -i:4200)
在Ubuntu中测试过。