正如标题所说,我正在运行多个游戏服务器,并且每个游戏服务器都具有相同的name
但不同的PID
和port
个数字。我想匹配正在侦听某个端口的服务器的PID
,然后我想杀死这个进程。我需要这样才能完成我的bash脚本。
这甚至可能吗?因为它在网上找不到任何解决方案。
答案 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 $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
答案 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中测试。