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