2012-03-24 97 views
64

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

这可能吗?因为它在网上还没有找到任何解决方案。

回答

90

netstat-p标志可以PID过程:

netstat -l -p 

编辑:所需要获取套接字的用户的PID在FreeBSD中的命令是sockstat。 随着我们@Cyclone,完成该工作线在讨论过程中摸索出的是:

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

'netstat:80:unknown或uninstrumented protocol'使用'80'(nginx)端口来测试purpoes。没有工作。 – Cyclone 2012-03-24 23:36:16

+0

你是怎么得到这个错误的?什么确切的命令产生了它? – stanwise 2012-03-24 23:45:07

+0

'netstat -l -p 80',当我做'netstat -l -p'时我收到了这个手册:http://pastebin.com/raw.php?i=q9jeQSBj – Cyclone 2012-03-24 23:48:56

7

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

+1

'netstat的:80:未知或桩的protocol'使用'80'(nginx)端口来测试purpoes。没有工作。 – Cyclone 2012-03-24 23:39:42

106

短版,您可以通杀命令:

lsof -i:80 -t 
+4

这还包括在该端口上_connected_的进​​程。 'lsof -i4TCP:80 -sTCP:LISTEN -t'可能是你想要的,而是。 – Nevir 2016-03-26 21:18:49

+0

正是我在找什么。我想通过搜索它正在运行的端口来终止一个进程。 – mythicalcoder 2017-05-25 13:08:09

+0

@Nevir你的意思是“还包括在该端口上连接的进程”?你能解释一下吗? – kishorer747 2017-07-05 06:22:11

8

netstat -p -l | grep $PORTlsof -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

1

由于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"" 
1

我想以编程方式编辑为 - 仅使用Bash - 终止侦听给定端口的进程。

比方说,端口是8089,那么这里就是我如何做到了:

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

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

+0

这里是我用来做的功能: 'function kill-listener {lsof -i:$ 1 -t | xargs kill -9 }' 使用您的8089端口示例:'kill-listener 8089' – 2017-06-21 14:00:14

0

在Windows上,netstat的选项来获得PID的是-o和-p选择协议过滤,例: 的netstat -a -p tcp的-o

相关问题