2012-03-24 142 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

相關問題