确定在某个端口上侦听的进程pid

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

这甚至可能吗? 因为它没有在网上find任何解决scheme。

netstat-p标志给你进程的PID:

 netstat -l -p 

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

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

短的版本,你可以通过杀死命令:

 lsof -i:80 -t 

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

netstat -p -l | grep $PORT netstat -p -l | grep $PORTlsof -i :$PORT解决scheme不错,但我更喜欢将POSIX(适用于coreutils )的fuser $PORT/tcp扩展语法与pipe道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

由于sockstat本来就没有安装在我的机器上,所以我篡改了stanwise的解决scheme来使用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"" 

我想以编程方式 – 只使用Bash – 杀死侦听给定端口的进程。

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

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

我希望这可以帮助别人! 我知道这将帮助我的球队。