如何找出哪个Node.js pid在哪个端口上运行

我想重新启动我的服务器上运行的许多Node.js进程之一。 如果我运行ps ax | grep node ps ax | grep node我得到所有我的节点处理程序的列表,但它不告诉我他们在哪个端口上。 如何杀死端口3000上运行的(例如)。 什么是pipe理多个Node进程的好方法?

如果你运行:

 $ netstat -anp 2> /dev/null | grep :3000 

你应该看到像这样的东西:

 tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 5902/node 

在这种情况下, 5902是PID。 你可以使用这样的东西来杀死它:

 netstat -anp 2> /dev/null | grep :3000 | awk '{ print $7 }' | cut -d'/' -f1 | xargs kill 

这是一个使用egrep的替代版本,可能会稍微好一点,因为它专门searchstring“节点”:

 netstat -anp 2> /dev/null | grep :3000 | egrep -o "[0-9]+/node" | cut -d'/' -f1 | xargs kill 

你可以把上面的代码转换成脚本,或者在你的~/.bashrcjoin以下内容:

 function smackdown () { netstat -anp 2> /dev/null | grep :$@ | egrep -o "[0-9]+/node" | cut -d'/' -f1 | xargs kill; } 

现在你可以运行:

 $ smackdown 3000 

一个class轮是

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

你只需要sudo,如果你正在杀死你的用户没有启动的进程。 如果你的用户启动了节点进程,你也许可以不使用sudo来终止它。

祝你好运!

为什么不是一个简单的基于fuser的解决

如果你不关心使用端口3000的过程是否是节点,它可能是如此简单

 fuser -k -n tcp 3000 

如果你不确定你不杀死其他进程,你可以用类似的东西去

 PID="$(fuser -n tcp 3000 2>/dev/null)" \ test "node"="$(ps -p $PID -o comm=)" && kill $PID 

这节省了我很多时间:

pkill node