Seek & Destroy: Windows Processes by Port

Recently, I've done a bit with Node.js and deploying to Windows Servers - and working with servers means learning more about cmd! One error I was receiving when I would terminate and restart my app was that stating the specified port was already occupied!

[nodemon] starting `node ./app.js`
events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: listen EADDRINUSE: address already in use :::8080
    at Server.setupListenHandle [as _listen2] (net.js:1313:16)
    at listenInCluster (net.js:1361:12)
    at Server.listen (net.js:1447:7)
    at Function.listen (C:\Users\user\Desktop\auth-server\node_modules\express\lib\application.js:618:24)
    at Object.<anonymous> (C:\Users\user\Desktop\auth-server\app.js:189:5)
    at Module._compile (internal/modules/cjs/loader.js:1138:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1158:10)
    at Module.load (internal/modules/cjs/loader.js:986:32)
    at Function.Module._load (internal/modules/cjs/loader.js:879:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:71:12)
Emitted 'error' event on Server instance at:
    at emitErrorNT (net.js:1340:8)
    at processTicksAndRejections (internal/process/task_queues.js:84:21) {
  code: 'EADDRINUSE',
  errno: 'EADDRINUSE',
  syscall: 'listen',
  address: '::',
  port: 8080
}
[nodemon] app crashed - waiting for file changes before starting...

I needed to terminate the process so I could re-start my node server with the changes I had made. I had a rough idea of what to do from working with bash a while back, but I needed to translate that knowledge into Windows' cmd format.

The first step is to find the Process ID for the process occupying the port I was trying to listen on. For this, we can use netstat -a -o -n to list all active connections.

C:\Users\user> netstat -a -o -n

Active Connections

Proto  Local Address          Foreign Address        State           PID
...
TCP    [::]:8080              [::]:0                 LISTENING       3664
...

In the list that gets spat out, you the line that has a Local Address ending in your port - in my case I was looking for :8080. Note the value in the PID column - we'll need that in a minute. NOTE: This value will most likely be different each time you start your program

This step is optional, but I like to double check that I'm targeting the correct process before I terminate it.

To get a list of tasks running in cmd we can run tasklist which details everything actively running on your machine.

C:\Users\user> tasklist

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
...
node.exe                      6736 Services                   0      2,080 K
cmd.exe                       3048 Services                   0      2,268 K
node.exe                      3664 Services                   0      6,768 K
...

Here, you can see that I have multiple node.exe programs running, but only one of them has our 3664 PID.

Now that we know our 3664 PID, we can commence putting an end to our runaway process. The general format is taskkill /f /pid ####, replacing the #### with our PID from above. If you try to run this without the /f flag, you'll probably be prompted to use the /f Force flag by Windows.

C:\Users\user> taskkill /f /pid 3664
SUCCESS: The process with PID 3664 has been terminated.

And now you're set to start your node server again!

  • Find what Process ID (PID) is occupying your port with netstat -a -o -n
  • (Optional) Confirm this PID is for the expected program with tasklist
  • Terminate the process with taskkill /f /pid #### (replace #### with your PID)