shell脚本杀死在端口3000上侦听的进程?

我想定义一个名为kill3000的bash别名来自动执行以下任务:

 $ lsof -i:3000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ruby 13402 zero 4u IPv4 2847851 0t0 TCP *:3000 (LISTEN) $ kill -9 13402 
 alias kill3000="fuser -k -n tcp 3000" 

尝试这个:

  kill -9 $(lsof -i:3000 -t) 

-t标志是你想要的:它显示PID,而不是别的。

UPDATE

万一过程没有find,你不想看到错误信息:

  kill -9 $(lsof -i:3000 -t) 2> /dev/null 

假设你正在运行bash。

UPDATE

Basile的build议非常好:我们应该先尝试终止进程正常情况下会杀死-TERM ,如果失败的话kill -KILL (AKA kill -9 ):

  pid=$(lsof -i:3000 -t); kill -TERM $pid || kill -KILL $pid 

你可能想要这个bash函数。

使用原始lsof命令的另一个选项:

 lsof -n -i:3000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs kill -9 

如果你想在shell脚本中使用它,你可以添加-r标志到xargs来处理没有进程正在监听的情况:

 ... | xargs -r kill -9 
 fuser -n tcp 3000 

将产生的输出

 3000/tcp: <$pid> 

所以你可以这样做:

 fuser -n tcp 3000 | awk '{ print $2 }' | xargs -r kill 

怎么样

 alias kill3000="lsof -i:3000 | grep LISTEN | awk '{print $2}' | xargs kill -9" 

fuser -k 3000/tcp也应该可以工作