371

I have a simple TCP server that listens on a port.

var net = require("net");

var server = net.createServer(function(socket) {
    socket.end("Hello!\n");
});

server.listen(7777);

I start it with node server.js and then close it with Ctrl+Z on Mac. When I try to run it again with node server.js I get this error message:

node.js:201
        throw e; // process.nextTick error, or 'error' event on first tick
          ^
Error: listen EADDRINUSE
at errnoException (net.js:670:11)
at Array.0 (net.js:771:26)
at EventEmitter._tickCallback (node.js:192:41)

Am I closing the program the wrong way? How can I prevent this from happening?

2
  • 5
    Probably worth adding that Ctrl-Z suspends a command on *NIX, and doesn't close it. If you type fg after Ctrl-Z, you'll be back where you left off. So your earlier node is still running. Watch out if you're doing this for other commands too!
    – ruffin
    Commented Nov 11, 2016 at 16:37
  • 4
    @ruffin this should be an answer. If you've done the Ctrl+Z action, a proper methodology could be fg to revive the process, and then Ctrl+C to kill it proper. Commented May 26, 2017 at 21:18

19 Answers 19

426

To end the program, you should be using Ctrl + C. If you do that, it sends SIGINT, which allows the program to end gracefully, unbinding from any ports it is listening on.

See also: https://superuser.com/a/262948/48624

16
  • 30
    Ctrl + C does not work for me. Only ^C gets typed into the console, and program does not exits.
    – Eleeist
    Commented May 9, 2012 at 19:21
  • 2
    @Eleeist, What are you using as a terminal? It works great for me.
    – Brad
    Commented May 9, 2012 at 19:22
  • 4
    @Eleeist, You've probably remapped your keys or something. Ctrl+C works fine. In any case, that's a separate issue from your real problem. You should post a "Ctrl+C doesn't work" question over at SuperUser.com.
    – Brad
    Commented May 9, 2012 at 19:31
  • 1
    @jt0dd You could always kill -9, but I wouldn't. Are you actually sure your application is still the one keeping ports open? I've never had that problem. As soon as my application ends, the connections are always immediately terminated. I would use netstat to determine if your app or something else is lingering on that port.
    – Brad
    Commented Jul 10, 2014 at 19:52
  • 1
    I faced to this problem when I was using keyboard type on other language. Be sure your mac input language is English Commented Dec 28, 2016 at 17:07
412

Ctrl+Z suspends it, which means it can still be running.

Ctrl+C will actually kill it.

you can also kill it manually like this:

ps aux | grep node

Find the process ID (second from the left):

kill -9 PROCESS_ID

This may also work

killall node
8
  • ctrl+c will work but none of these command will work for me. I don't know why ? And I'm looking for command line solution
    – angry kiwi
    Commented Aug 26, 2012 at 3:59
  • 11
    Be careful with killall node, you might kill process you wouldn't want to kill if they match "node" Commented Jul 17, 2013 at 17:21
  • 5
    you may want to move up killall nodein your answer since that is really the easiest and most reliable option (as long as you're ok with killing all instances)
    – Boern
    Commented Jan 24, 2016 at 14:42
  • 6
    'killall' is not recognized as an internal or external command, operable program or batch file. Am i missing something?
    – Ayyash
    Commented Nov 8, 2016 at 8:42
  • Same here... No answer? It says 'killall' is not recognized. None of the other commands work either. Do I need to restart my computer or what? Commented Feb 1, 2017 at 2:13
44

Or alternatively you can do all of these in one line:

kill -9 $(ps aux | grep '\snode\s' | awk '{print $2}')

You can replace node inside '\snode\s' with any other process name.

2
  • 3
    alternately, you can always try: ps -ef | grep "node" | awk '{print $2}' | xargs kill -9
    – frymaster
    Commented Jul 16, 2015 at 22:20
  • Seems to work but does not properly return me to a prompt. Thoughts?
    – user736893
    Commented Sep 5, 2019 at 17:49
40

Resume and kill the process:

Ctrl+Z suspends it, which means it is still running as a suspended background process.

You are likely now at a terminal prompt...

  1. Give the command fg to resume the process in the foreground.

  2. Type Ctrl+C to properly kill it.


Alternatively, you can kill it manually like this:

(NOTE: the following commands may require root, so sudo ... is your friend)

pkill -9 node

or, if you don't have pkill, this may work:

killall node

or perhaps this:

kill $(ps -e | grep node | awk '{print $1}')

sometimes the process will list its own grep, in which case you'll need:

kill $(ps -e | grep dmn | awk '{print $2}')

h/t @ruffin from the comments on the question itself. I had the same issue and his comment helped me solve it myself.

24

If you are running Node.js interactively (the REPL):

Ctrl + C will take back you to > prompt then type:

process.exit()

or just use Ctrl + D.

0
22

you can type .exit to quit node js REPL

1
  • 3
    That assumes that you are in REPL to begin with. What if I have a Node script running? Commented Mar 6, 2017 at 17:26
20

on linux try: pkill node

on windows:

Taskkill /IM node.exe /F

or

from subprocess import call

call(['taskkill', '/IM', 'node.exe', '/F'])
1
  • Taskkill /IM node.exe /F worked for me on windows10 with node.js running on a usb. I am using pm2 to start/stop but this doesn't stop node.js which means you can't safely eject the usb as node.js still runs after pm2 stop. Your solution is perfect! Commented Jan 1, 2022 at 20:02
17

$ sudo killall node in another terminal works on mac, while killall node not working:

$ killall node
No matching processes belonging to you were found
14

you can work following command to be specific in localserver kill(here: 8000)

http://localhost:8000/ kill PID(processId):

$:lsof -i tcp:8000

It will give you following groups of TCPs:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

node 21521 ubuntu 12u IPv6 345668 0t0 TCP *:8000 (LISTEN)

$:kill -9 21521

It will kill processId corresponding to TCP*:8000

1
  • Something to the point! Thank you.
    – Fawkes
    Commented Dec 5, 2022 at 10:33
9

You can use fuser to get what you want to be done.

In order to obtain the process ids of the tasks running on a port you can do:

fuser <<target_port>>/tcp

Let's say the port is 8888, the command becomes:

fuser 8888/tcp

And to kill a process that is running on a port, simply add -k switch.

fuser <<target_port>>/tcp -k

Example (port is 8888):

fuser 8888/tcp -k

That's it! It will close the process listening on the port. I usually do this before running my server application.

8

For MacOS

  1. Open terminal
  2. Run the below code and hit enter

     sudo kill $(sudo lsof -t -i:4200)
    
0
6

Though this is a late answer, I found this from NodeJS docs:

The 'exit' event is emitted when the REPL is exited either by receiving the .exit command as input, the user pressing <ctrl>-C twice to signal SIGINT, or by pressing <ctrl>-D to signal 'end' on the input stream. The listener callback is invoked without any arguments.

So to summarize you can exit by:

  1. Typing .exit in nodejs REPL.
  2. Pressing <ctrl>-C twice.
  3. pressing <ctrl>-D.
  4. process.exit(0) meaning a natural exit from REPL. If you want to return any other status you can return a non zero number.
  5. process.kill(process.pid) is the way to kill using nodejs api from within your code or from REPL.
6

I'm adding this answer because for many projects with production deployments, we have scripts that stop these processes so we don't have to.

A clean way to manage your Node Server processes is using the forever package (from NPM).

Example:

Install Forever

npm install forever -g

Run Node Server

forever start -al ./logs/forever.log -ao ./logs/out.log -ae ./logs/err.log server.js

Result:

info: Forever processing file: server.js

Shutdown Node Server

forever stop server.js

Result

info: Forever stopped process: uid command script forever pid id logfile uptime [0] sBSj "/usr/bin/nodejs/node" ~/path/to/your/project/server.js 23084 13176 ~/.forever/forever.log 0:0:0:0.247

This will cleanly shutdown your Server application.

5

If you want to stop your server with npm stop or something like this. You can write the code that kill your server process as:

require('child_process').exec(`kill -9 ${pid}`)

Check this link for the detail: https://gist.github.com/dominhhai/aa7f3314ad27e2c50fd5

3

I ran into an issue where I have multiple node servers running, and I want to just kill one of them and redeploy it from a script.

Note: This example is in a bash shell on Mac.

To do so I make sure to make my node call as specific as possible. For example rather than calling node server.js from the apps directory, I call node app_name_1/app/server.js

Then I can kill it using:

kill -9 $(ps aux | grep 'node\ app_name_1/app/server.js' | awk '{print $2}')

This will only kill the node process running app_name_1/app/server.js.

If you ran node app_name_2/app/server.js this node process will continue to run.

If you decide you want to kill them all you can use killall node as others have mentioned.

2

Late answer but on windows, opening up the task manager with CTRL+ALT+DEL then killing Node.js processes will solve this error.

1

My use case: on MacOS, run/rerun multiple node servers on different ports from a script

run: "cd $PATH1 && node server1.js & cd $PATH2 && node server2.js & ..."

stop1: "kill -9 $(lsof -nP -i4TCP:$PORT1 | grep LISTEN | awk '{print $2}')"

stop2, stop3...

rerun: "stop1 & stop2 & ... & stopN ; run

for more info about finding a process by a port: Who is listening on a given TCP port on Mac OS X?

1

For windows first search the PID with your port number

netstat -ano | findStr "portNumber"

After that, kill the task, make sure you are in root of your "c" drive enter image description here And the command will be taskkill /F /PID your pid

1

if you are using VS Code and terminal select node from the right side dropdown first and then do Ctrl + C. Then It will work

enter image description here

Press y when you are prompted.

enter image description here

Thanks

Not the answer you're looking for? Browse other questions tagged or ask your own question.