如何找出哪个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
你可以把上面的代码转换成脚本,或者在你的~/.bashrc
join以下内容:
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