这是我第一次使用Node.js,我遇到了这个问题:
我已经通过IDE的插件启动了Node服务器。不幸的是,我不能使用IDE的终端。所以我尝试从命令行运行脚本。
这就是问题所在——我正在使用Express模块,我的应用程序正在监听一些端口(8080)。当我从命令行启动应用程序时,它抛出以下错误:
events.js:71
throw arguments[1]; // Unhandled 'error' event
^
Error: listen EADDRINUSE
at errnoException (net.js:770:11)
at HTTPServer.Server._listen2 (net.js:910:14)
at listen (net.js:937:10)
at HTTPServer.Server.listen (net.js:986:5)
at Object.<anonymous> (C:\xampp\htdocs\node\chat\app.js:5:5)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.runMain (module.js:492:10)
尽管我不太确定这个错误是什么,但我假设这是因为应用程序正在监听一个已经在使用的端口。于是我做了:
netstat -an
我能看到
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING
这是因为当我试图从IDE启动Node服务器时,它已经启动了。
我想知道,如何停止所有服务器实例?还有,如果你能告诉我如何检测端口上运行的程序并关闭它。
Windows机器:
需要杀死一个Node.js服务器,并且你没有任何其他Node进程在运行,你可以告诉你的机器杀死所有名为Node. exe的进程。它看起来是这样的:
taskkill /im node.exe
如果进程仍然存在,你可以通过添加/f标志强制进程终止:
taskkill /f /im node.exe
如果需要更细粒度的控制,并且只需要终止在特定端口上运行的服务器,则可以使用netstat查找进程ID,然后向其发送终止信号。所以在你的例子中,端口是8080,你可以运行以下命令:
C:\>netstat -ano | find "LISTENING" | find "8080"
输出的第五列是进程ID:
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 14828
TCP [::]:8080 [::]:0 LISTENING 14828
然后可以使用taskkill /pid 14828终止进程。如果进程拒绝退出,那么只需在命令中添加/f (force)参数。
MacOS机:
过程几乎完全相同。你可以杀死机器上运行的所有Node进程:
killall node
或者也像下面@jacob-groundwater的回答中提到的那样,使用lsof,你可以找到侦听端口的进程的PID(传递-i标志和端口来显著加快速度):
$ lsof -Pi :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 1073 urname 22u IPv6 bunchanumbershere 0t0 TCP *:8080 (LISTEN)
在这种情况下,进程ID是PID列下面的数字,然后你可以把它传递给kill命令:
$ kill 1073
如果进程拒绝退出,那么只使用-9标志,这是一个SIGTERM,不能被忽略:
$ kill -9 1073
Linux机器:
同样,这个过程几乎是相同的。你可以杀死机器上运行的所有Node进程(如果SIGKILL不够,使用-$SIGNAL):
killall node
或者使用netstat,你可以找到监听端口的进程的PID:
$ netstat -nlp | grep :8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1073/node
在这种情况下,进程ID是第六列中进程名之前的数字,然后你可以把它传递给kill命令:
$ kill 1073
如果进程拒绝退出,那么只使用-9标志,这是一个SIGTERM,不能被忽略:
$ kill -9 1073
Windows机器:
需要杀死一个Node.js服务器,并且你没有任何其他Node进程在运行,你可以告诉你的机器杀死所有名为Node. exe的进程。它看起来是这样的:
taskkill /im node.exe
如果进程仍然存在,你可以通过添加/f标志强制进程终止:
taskkill /f /im node.exe
如果需要更细粒度的控制,并且只需要终止在特定端口上运行的服务器,则可以使用netstat查找进程ID,然后向其发送终止信号。所以在你的例子中,端口是8080,你可以运行以下命令:
C:\>netstat -ano | find "LISTENING" | find "8080"
输出的第五列是进程ID:
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 14828
TCP [::]:8080 [::]:0 LISTENING 14828
然后可以使用taskkill /pid 14828终止进程。如果进程拒绝退出,那么只需在命令中添加/f (force)参数。
MacOS机:
过程几乎完全相同。你可以杀死机器上运行的所有Node进程:
killall node
或者也像下面@jacob-groundwater的回答中提到的那样,使用lsof,你可以找到侦听端口的进程的PID(传递-i标志和端口来显著加快速度):
$ lsof -Pi :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 1073 urname 22u IPv6 bunchanumbershere 0t0 TCP *:8080 (LISTEN)
在这种情况下,进程ID是PID列下面的数字,然后你可以把它传递给kill命令:
$ kill 1073
如果进程拒绝退出,那么只使用-9标志,这是一个SIGTERM,不能被忽略:
$ kill -9 1073
Linux机器:
同样,这个过程几乎是相同的。你可以杀死机器上运行的所有Node进程(如果SIGKILL不够,使用-$SIGNAL):
killall node
或者使用netstat,你可以找到监听端口的进程的PID:
$ netstat -nlp | grep :8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1073/node
在这种情况下,进程ID是第六列中进程名之前的数字,然后你可以把它传递给kill命令:
$ kill 1073
如果进程拒绝退出,那么只使用-9标志,这是一个SIGTERM,不能被忽略:
$ kill -9 1073