2012-04-08 54 views
1

目前我做的到以下明確的所有進程端口如何找到一個過程,在一個單一的bash腳本殺死它

lsof -i :10000 

運行,我得到

COMMAND  PID   USER FD TYPE  DEVICE SIZE/OFF NODE NAME 
Google 10427   user 60u IPv4 0x162adea8  0t0 TCP localhost:52478->localhost:ndmp (ESTABLISHED) 
Google 10427   user 112u IPv4 0x16289b98  0t0 TCP localhost:52483->localhost:ndmp (ESTABLISHED) 

然後我殺了它

kill 10427 

我正在尋找一種方法來簡化上述過程。 我猜測解決方案與管道輸出和殺死它有關。 就像(我想,在這裏我假設1美元是10427)。

lsof -i :10000 | kill $1 

我沒有做太多的bash腳本所以任何幫助將是巨大的。

回答

4

我想你想要像

fuser -k -n tcp 10000 

lsof soultion會更喜歡

lsof -i :10000|tail -n +2|awk '{print $2}'|xargs -r kill 
+0

謝謝,我得到它的工作。我在osx上,xargs似乎沒有-r選項(我檢查了手冊頁[man](http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages /man1/xargs.1.html))應該提到這一點。該命令也可以在沒有-r的情況下運行。你介意告訴我-r做了什麼? – elliance 2012-04-08 10:32:20

+0

'r'標誌用於GNU xargs,意味着如果標準輸入爲空(即,如果awk不輸出任何內容,則不運行kill)時不應運行該命令。 – 2012-04-08 11:06:31

+0

謝謝,@EmilVikström,是的,股票osx xargs不接受'-r',但是,如果你有macports,你可以使用'gxargs'(最有可能的'findutils'端口)。另外osx'fuser'可能不會做到這一點。 – 2012-04-08 16:50:58

1

我認爲邁克爾的回答是最好的,但只是參考,你可以做這樣的事情作爲好:

PID=`lsof -i :10000 | awk 'NR == 2 {print $2}'` 
kill $PID 
+0

錯誤...那將試圖殺死'PID'。它是'tail',而不是'head',你想要做什麼;-) – 2012-04-08 09:00:11

+0

oops,而不是'PID','COMMAND'。因爲它是'$ 2'。 – 2012-04-08 09:00:56

+0

我知道,我不應該登錄到SO當我直接起牀...: -/ – 2012-04-08 09:14:33

1

或者使用它!

kill $(lsof -i :www | awk '{print $2}' | grep -v PID)