我想重新启动服务器上正在运行的多个Node.js进程之一。如果我运行ps ax | grep node
,我会得到所有Node进程的列表,但它并没有告诉我它们在哪个端口上运行。如何杀掉运行在3000端口上的进程(例如)?有什么好的方法来管理多个Node进程?
如果你运行:
$ 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用法: kill pid ... 发送SIGTERM信号给列出的每个进程。 kill signal pid ... 向列出的每个进程发送一个信号。 kill -s signal pid ... 向列出的每个进程发送一个信号。 kill -l 列出所有信号名称。 kill -L 以漂亮的表格列出所有信号名称。 kill -l signal 在信号编号和名称之间进行转换。
- Pardonersource ~/.bashrc
。 - David Weldon这个命令让我省了很多时间:
pkill node
A one-liner is
lsof -n -i:5000 | grep LISTEN | awk '{ print $2 }' | uniq | xargs -r kill -9
如果您要终止一个非您启动的进程,则需要使用sudo。如果您的用户启动了node进程,则可以在不使用sudo的情况下终止它。
祝好运!
为什么不使用基于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