Brewing a potion
unsplashunsplash
Gradient background

How to kill processes running on localhost (macOS)

Clarice Bouwer

Software Engineering Team Lead and Director of Cloudsure

Thursday, 20 January 2022 · Estimated 2 minute read

Motivation

Sometimes a process, like a web server or running Clojure REPL, closes unexpectedly but the port is never released. I'd need to find that process and kill it so that I can rightfully claim my port back.

Find the process

Copy
netstat -vanp tcp | grep "*."

It will return something like this (note that the table scrolls to the right):

Copy
tcp4       0      0  *.3000                 *.* LISTEN      131072 131072  46834      0 0x0100 0x00000106
tcp46      0      0  *.8085                 *.* LISTEN      131072 131072  29254      0 0x0100 0x00000006
tcp46      0      0  *.8321                 *.* LISTEN      131072 131072  29254      0 0x0100 0x00000006
tcp46      0      0  *.8080                 *.* LISTEN      131072 131072  29254      0 0x0100 0x00000006
tcp4       0      0  *.61350                *.* LISTEN      131072 131072  29278      0 0x0100 0x00000006
tcp4       0      0  127.0.0.1.61933        *.* LISTEN      131072 131072   2951      0 0x0100 0x00000106
tcp4       0      0  127.0.0.1.45623        *.* LISTEN      131072 131072   2951      0 0x0100 0x00000106
tcp4       0      0  127.0.0.1.49489        *.* LISTEN      131072 131072   2951      0 0x0100 0x00000106
tcp4       0      0  127.0.0.1.49488        *.* LISTEN      131072 131072   2951      0 0x0100 0x00000106
tcp4       0      0  127.0.0.1.16494        *.* LISTEN      131072 131072   2901      0 0x0000 0x0000020f
tcp4       0      0  127.0.0.1.15393        *.* LISTEN      131072 131072   2901      0 0x0000 0x0000020f
tcp4       0      0  127.0.0.1.15292        *.* LISTEN      131072 131072   2901      0 0x0000 0x0000020f
tcp4       0      0  127.0.0.1.6463         *.* LISTEN      131072 131072    838      0 0x0100 0x00000106

Identify the process

The 3rd column after LISTEN is the pid. Taking the first entry (a process running on :3000), I can safely grab its pid of 46834 and inspect it.

Copy
ps aux | grep 46834

It will return something like this:

Copy
clarice          46834   0.0  1.3 441950208 219760 s001  S+    9:06pm   0:25.95 /Users/clarice/.nvm/versions/node/v16.13.0/bin/node /Users/clarice/Workspace/demos/react/node_modules/react-scripts/scripts/start.js
clarice          58003   0.0  0.0 408628368   1632 s010  S+    4:52am   0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn --exclude-dir=.idea --exclude-dir=.tox 46834

Based on this output, the first entry gives me the most information. I can see it's a Node.js application and it's coming from demos/react app. That's the correct one so I can kill it.

The 2nd entry is always present on a terminal grep. I believe it to be the coloured output of the terminal.

Kill the process

Now that I have the right process, I can kill it using kill 46834. If the process is stubborn and keen on staying alive, you can force it by using kill -9 46834

(I think these commands are Unix based so it should work on Linux too)