2012-04-08 52 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)