This is my first time working with Node.js and I ran into this problem:
I have started a Node server through the plugin of an IDE. Unfortunately, I cannot use the IDE's terminal. So I tried to run the script from the command line.
This is the problem - I am using the Express module and my app is listening some port (8080). When I start the app from the command line, it throws this error:
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)
Even though I am not very sure what this error could be I assumed that it's because the app is listening on a port which is already in use. So I did:
netstat -an
I can see
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING
It's because the Node server is already started when I tried to start it from the IDE.
So I want to know, how can I stop all server instances? Also if you can tell me how to detect what's running on a port and kill it.
Windows Machine:
Need to kill a Node.js server, and you don't have any other Node processes running, you can tell your machine to kill all processes named node.exe
. That would look like this:
taskkill /im node.exe
And if the processes still persist, you can force the processes to terminate by adding the /f
flag:
taskkill /f /im node.exe
If you need more fine-grained control and need to only kill a server that is running on a specific port, you can use netstat
to find the process ID, then send a kill signal to it. So in your case, where the port is 8080
, you could run the following:
C:\>netstat -ano | find "LISTENING" | find "8080"
The fifth column of the output is the process ID:
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 14828
TCP [::]:8080 [::]:0 LISTENING 14828
You could then kill the process with taskkill /pid 14828
. If the process refuses to exit, then just add the /f
(force) parameter to the command.
MacOS machine:
The process is almost identical. You could either kill all Node processes running on the machine:
killall node
Or also as alluded to in @jacob-groundwater's answer below using lsof
, you can find the PID of a process listening on a port (pass the -i
flag and the port to significantly speed this up):
$ lsof -Pi :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 1073 urname 22u IPv6 bunchanumbershere 0t0 TCP *:8080 (LISTEN)
The process ID in this case is the number underneath the PID column, which you could then pass to the kill
command:
$ kill 1073
If the process refuses to exit, then just use the -9
flag, which is a SIGTERM
and cannot be ignored:
$ kill -9 1073
Linux machine:
Again, the process is almost identical. You could either kill all Node processes running on the machine (use -$SIGNAL
if SIGKILL
is insufficient):
killall node
Or also using netstat
, you can find the PID of a process listening on a port:
$ netstat -nlp | grep :8080
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 1073/node
The process ID in this case is the number before the process name in the sixth column, which you could then pass to the kill
command:
$ kill 1073
If the process refuses to exit, then just use the -9
flag, which is a SIGTERM
and cannot be ignored:
$ kill -9 1073
Works for Linux, OS X
killall node
node: no process found
Also when I grep for a node processes which run on the specific port, the process ID has -
instead of a number itself.
You can use lsof
get the process that has bound to the required port.
Unfortunately the flags seem to be different depending on system, but on Mac OS X you can run
lsof -Pi | grep LISTEN
For example, on my machine I get something like:
mongod 8662 jacob 6u IPv4 0x17ceae4e0970fbe9 0t0 TCP localhost:27017 (LISTEN)
mongod 8662 jacob 7u IPv4 0x17ceae4e0f9c24b1 0t0 TCP localhost:28017 (LISTEN)
memcached 8680 jacob 17u IPv4 0x17ceae4e0971f7d1 0t0 TCP *:11211 (LISTEN)
memcached 8680 jacob 18u IPv6 0x17ceae4e0bdf6479 0t0 TCP *:11211 (LISTEN)
mysqld 9394 jacob 10u IPv4 0x17ceae4e080c4001 0t0 TCP *:3306 (LISTEN)
redis-ser 75429 jacob 4u IPv4 0x17ceae4e1ba8ea59 0t0 TCP localhost:6379 (LISTEN)
The second number is the PID and the port they're listening to is on the right before "(LISTEN)". Find the rogue PID and kill -9 $PID
to terminate with extreme prejudice.
Windows & GitBash Terminal I needed to use this command inside Windows / Webstorm / GitBash terminal
cmd "/C TASKKILL /IM node.exe /F"
if you want to kill a specific node process , you can go to command line route and type:
ps aux | grep node
to get a list of all node process ids. now you can get your process id(pid), then do:
kill -9 PID
and if you want to kill all node processes then do:
killall -9 node
-9 switch is like end task on windows. it will force the process to end. you can do:
kill -l
to see all switches of kill command and their comments.
Linux
To impress your friends
ps aux | grep -i node | awk '{print $2}' | xargs kill -9
But this is the one you will remember
killall node
You can try this:
taskkill /IM node.exe -F
it works fine in windows 10
taskkill /f /im node.exe
If you are using Windows, follow this:
Open task manager, look for this process: Then just right click and "End task" it. That's it, now all the npm commands run form the start.
Multiplatform, stable, best solution:
use fkill to kill process which is taking your port:
fkill -f :8080
To install fkill use command: npm i -g fkill
npm i -g fkill-cli
.
You could also try:
killall nodejs
you can try
killall node
you can also try
killall nodejs
Am Using windows Operating system.
I killed all the node process and restarted the app it worked.
try
taskkill /im node.exe
Use the following command to kill and restart node server from batch file
@echo off
cd "D:\sam\Projects\Node"
taskkill /IM node.exe -F
start /min cmd /C "node index.js"
goto :EOF
in windows command Type command blow:
taskkill /f /im node.exe
Since you specified Windows. If you want to include this in a bat file, you might not want it to generate an error if the process is not running.
So, to prevent "ERROR: The process "node.exe" not found.", you can add a filter:
TASKKILL /F /IM node.exe /FI "PID gt 0"
lsof -Pi :number-of-port
e.g. 3000
then will appear something like that on your terminal
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 26476 node 30u IPv6 63828225 0t0 TCP *:3000 (LISTEN)
kill PID-NUMBER-YOU-WANNA-KILL
e.g kill 26476
PID stands for Process ID
Press in cmd or bash : Ctrl + C
Success story sharing
process.exit()
in your application causes the NodeJS instance to close.killall node
in bash would kill all NodeJS instances running on your machine.taskkill /IM node.exe
. It will kill all processes namednode.exe
.