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

15

我想重新启动服务器上正在运行的多个Node.js进程之一。如果我运行ps ax | grep node,我会得到所有Node进程的列表,但它并没有告诉我它们在哪个端口上运行。如何杀掉运行在3000端口上的进程(例如)?有什么好的方法来管理多个Node进程?


可能是Unix上使用哪些端口的进程?的重复问题。 - blu
@blu 是的,你说得对。我没有看到那个。 - Pardoner
4个回答

27

如果你运行:

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

你应该看到类似以下内容:

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

在这种情况下,5902 是进程 ID。您可以使用类似以下的命令来终止它:

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

很高兴能够提供帮助。 :) 我在答案中添加了一个替代(可能更安全)的命令版本和一个.bashrc函数。 - David Weldon
把smackdown函数放在我的bashrc中,但它只输出用法: kill pid ... 发送SIGTERM信号给列出的每个进程。 kill signal pid ... 向列出的每个进程发送一个信号。 kill -s signal pid ... 向列出的每个进程发送一个信号。 kill -l 列出所有信号名称。 kill -L 以漂亮的表格列出所有信号名称。 kill -l signal 在信号编号和名称之间进行转换。 - Pardoner
在命令行上,egrep 版本是否能够正常工作?您可以通过从下到上删除命令(从 xargs 调用开始)并查看打印的内容来尝试调试 .bashrc 函数。记得在每次更改后执行 source ~/.bashrc - David Weldon
稍微补充一下:如果你在敏感端口(如80)上运行,可能需要在命令前添加“sudo”。 - Michael Litvin
而且,你可能需要在末尾添加管道符号“| uniq”,因为该行可能会重复多次。 - Michael Litvin

13

这个命令让我省了很多时间:

pkill node


:D :D @NaveedUlIslam - Kumar KS
尽管这并没有精确回答整个问题,但实际上我只会在每台服务器上运行一个Node实例。在这种情况下,端口号变得无关紧要。 - Naveed Ul Islam

7

A one-liner is

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

如果您要终止一个非您启动的进程,则需要使用sudo。如果您的用户启动了node进程,则可以在不使用sudo的情况下终止它。

祝好运!


1

为什么不使用基于fuser的简单解决方案?

如果您不关心使用端口3000的进程是否为Node,那么可以非常简单:

fuser -k -n tcp 3000

如果您想确保不会杀死其他进程,可以使用类似以下的方法:
PID="$(fuser -n tcp 3000 2>/dev/null)" \
  test "node"="$(ps -p $PID -o comm=)" && kill $PID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接