确定在某个端口上侦听的进程pid
正如标题所说,我正在运行多个游戏服务器,并且每个游戏服务器都有相同的name
但具有不同的PID
和port
号。 我想匹配正在侦听某个端口的服务器的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 $PORT
和lsof -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
我希望这可以帮助别人! 我知道这将帮助我的球队。