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

时间:2012-10-29 20:51:52

标签: node.js port kill pid

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

4 个答案:

答案 0 :(得分:16)

如果你跑:

$ 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的替代版本,可能会更好一点,因为它专门搜索字符串'node':

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

您可以将上述内容转换为脚本,或将以下内容放入~/.bashrc

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

现在你可以运行:

$ smackdown 3000

答案 1 :(得分:5)

单线是

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

如果您要杀死用户未启动的进程,则只需要sudo。如果您的用户启动了节点进程,您可能无法使用sudo来终止它。

祝你好运!

答案 2 :(得分:3)

这为我节省了很多时间:

pkill node

答案 3 :(得分:0)

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

如果您不关心使用端口3000的进程是否为节点,则可以像

一样简单
fuser -k -n tcp 3000

如果你不确定你不会杀死其他进程,你可以使用像

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