Find (and kill) process locking port 3000 on Mac [closed]

Asked 2023-09-20 20:23:04 View 191,427

How do I find (and kill) processes that listen to/use my TCP ports? I'm on macOS.

Sometimes, after a crash or some bug, my Rails app is locking port 3000. I can't find it using ps -ef...

When running

rails server

I get

Address already in use - bind(2) (Errno::EADDRINUSE)

The same issue happens when stopping Node.js process. Even after the process is stopped and the app stops running, port 3000 is locked. When starting the app again, getting

Address already in use (Errno::EADDRINUSE)
  • A very neat solution to kill a process on ANY user-specified port can be found in @Kevin Suttle's answer below. Reproduced here for posterity: function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 } - anyone
  • @user456584 's comment above should be the accepted answer ^^^ That function worked to kill the many processes i had running on a port - anyone
  • works after finding processes with netstat and killing the process with kill -9 command! - anyone
  • @richardec kill -9 $(lsof -ti:3000) not working? - anyone
  • This is clearly a very specific programming problem that a lot of folks Google all the time. I need to find out what's running on a port so I can restart my webapp. I do not believe it should be closed. Vote to reopen. - anyone

Answers

  1. You can try netstat

    netstat -vanp tcp | grep 3000
    
  2. For macOS El Capitan and newer (or if your netstat doesn't support -p), use lsof

    lsof -i tcp:3000
    

Answered   2023-09-20 20:23:04

  • Thank you! Your answer gave birth to my "death_to 'port'" script. (#!/usr/bin/ruby lsof -t -i tcp:#{ARGV.first} | xargs kill) - anyone
  • The "terse" flag to lsof produces output suitable for piping to a subsequent kill: lsof -t -i tcp:1234 | xargs kill - anyone
  • I have put this into my ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkill So now I just have to type killport 8080 and it saves me some seconds - anyone
  • Another tip is to add -P to the lsof command so that the raw port is visible in the output: lsof -P -i:3000 - anyone
  • This post is only half the answer - anyone

Find:

sudo lsof -i :3000

Kill:

kill -9 <PID>

PLEASE NOTE: -9 kills the process immediately, and gives it no chance of cleaning up after itself. This may cause problems. Consider using -15 (TERM) or -3 (QUIT) for a softer termination which allows the process to clean up after itself.

Answered   2023-09-20 20:23:04

  • Sometimes lsof -i :port will show nothing. try sudo lsof -i :port. - anyone
  • Recommend trying kill -15 <PID> before resorting to -9 for safety. - anyone
  • @MichaelTrouw almost a year later, but here's your answer. :-) unix.stackexchange.com/a/8918 TL;DR kill -15 gives the process a chance to clean up after itself. - anyone
  • I think this answer should say what -9 does. - anyone
  • Please don't just use kill -9 without thinking twice, and trying other signals first. It will cause a process to exit immediately, without cleaning up after itself, possibly leaving a mess behind or leaving databases in inconsistent state... Try a TERM (default for kill, no flag needed) or QUIT (kill -3 pid) first at least, and check what process you are dealing with before sending a KILL. - anyone

Quick and easiest solution:

kill -9 $(lsof -ti:3000)

For multiple ports:

kill -9 $(lsof -ti:3000,3001)

#3000 is the port to be freed

Kill multiple ports with single line command:

kill -9 $(lsof -ti:3000,3001)

#Here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti:3000

If the port is occupied, the above command will return something like this: 82500 (Process ID)

lsof -ti:3001

82499

lsof -ti:3001,3000

82499 82500

kill -9 $(lsof -ti:3001,3000)

Terminates both 82499 and 82500 processes in a single command.

For using this in package.json scripts:

"scripts": {
   "start": "kill -9 $(lsof -ti:3000,3001) && npm start"
}

In terminal you can use:

npm run start

Answered   2023-09-20 20:23:04

  • This should be the best solution. Does both find AND kill in one short, simple command :) - anyone
  • I get "kill: not enough arguments" when the port is free. Is it possible to condition it to work both when is taken and when is free? - anyone
  • Try: $(lsof -ti:3000) && kill -9 $(lsof -ti:3000) - anyone
  • Based on the answer here, i have created tap brew tap devasghar/portkill && brew install devasghar/portkill/homebrew-portkill then you can do portkill 3000 & for multiple ports portkill 3000,3001 - anyone
  • I tried this oneliner but I got the following: kill: not enough arguments - anyone

Nothing above worked for me. Anyone else with my experience could try the following (worked for me):

Run:

lsof -i :3000 (where 3000 is your current port in use)

then check status of the reported PID :

ps ax | grep <PID>

finally, "begone with it":

kill -QUIT <PID>

Answered   2023-09-20 20:23:04

  • This actually seems a better answer than the one give much later by Filip Spiridonov, which has 277 upvotes against your 9. Yours was 6 months earlier, and has the same information with a bit more explanation. There is no justice... - anyone
  • Try kill -TERM (or just kill) before kill -QUIT. Not every process is going to do an orderly shutdown on SIGQUIT. - anyone

This single command line is easy to remember:

npx kill-port 3000

You can also kill multiple ports at once:

npx kill-port 3000 3001 3002

For a more powerful tool with search:

npx fkill-cli


PS: They use third party javascript packages. npx comes built in with Node.js.

Sources: tweet | github

Answered   2023-09-20 20:23:04

  • Can you share details on installing npx using brew? I tried installing it on my Mac High Sierra, 10.13.3 and it won't work. - anyone
  • @realPK npx comes with npm which comes with node.js, so it's not a separated package. Just upgrade your node.js and your npm versions. - anyone
  • I do Java mostly, haven't exposed myself to Node yet. I found a different way of killing service running on port. TY for responding. - anyone
  • The need for NodeJS and JavaScript, to kill something running on port 3000 probably rails... seems like too much overhead to me. adding a simple line to your .bashrc or .zshrc with an alias would solve it without the need for the internet. alias kill3000='lsof -ti:3000 | xargs kill' then you can do: kill3000 - anyone
  • works flawlessly! - anyone

A one-liner to extract the PID of the process using port 3000 and kill it.

lsof -ti:3000 | xargs kill

The -t flag removes everything but the PID from the lsof output, making it easy to kill it.

Answered   2023-09-20 20:23:04

  • You can filter out "listening" ports with: lsof -ti:3000 -sTCP:LISTEN - anyone
  • This method works best for me. Simple one liner that clears the busy port. Thanks! - anyone
  • I added a couple of functions to my profile based on this sh port-kill() { lsof -ti :"$1" | xargs kill -9; } # give process a chance to gracefully quit port-quit() { lsof -ti :"$1" | xargs kill -QUIT; } - anyone

You can use lsof -i:3000.

That is "List Open Files". This gives you a list of the processes and which files and ports they use.

Answered   2023-09-20 20:23:04

  • This is a great way to find it, can you update your answer to include the easiest way to kill the command? - anyone

To forcefully kill a process like that, use the following command

lsof -n -i4TCP:3000  

OR lsof -i:3000

Where 3000 is the port number the process is running at

this returns the process id(PID) and run

kill -9 "PID"

Replace PID with the number you get after running the first command

For Instance, if I want kill the process running on port 8080

Why kill -9 PID does not work? If you trying to kill a process with its PID and it still runs on another PID, it looks like you have started that process in a different account most probably root account. so Login in with sudo su and kill it

Answered   2023-09-20 20:23:04

  • I tried creating an alias in ZSH: alias port="lsof -n -i4TCP:$1" and got the following error... How to achieve this? $ port 8080 lsof: unacceptable port specification in: -i 4TCP: - anyone

In your .bash_profile, create a shortcut for terminate the 3000 process:

terminate(){
  lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 
}

Then, call $terminate if it's blocked.

Answered   2023-09-20 20:23:04

To kill multi ports.

$ npx kill-port 3000 8080 8081

Process on port 3000 killed
Process on port 8080 killed
Process on port 8081 killed

Hope this help!

Answered   2023-09-20 20:23:04

  • How about using npx to find running ports? - anyone
  • Npx seems support detect port like 'npx detect-port 8080'. But seems not supporting find all running ports. - anyone
  • this is the best because it's easy to remember - anyone
lsof -P | grep ':3000' | awk '{print $2}'

This will give you just the pid, tested on MacOS.

Answered   2023-09-20 20:23:04

  • on MAC kill all pids on port 3000: lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9 - anyone
  • can more than one process listen to the same port? - anyone
  • Our rails app spawns workers which are child processes, and I have to use this to kill orphaned workers - anyone
  • this also kills webbrowsers connecting to port - anyone
  • Here is working one: lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9 - anyone

Execute in command line on OS-X El Captain:

kill -kill `lsof -t -i tcp:3000`

Terse option of lsof returns just the PID.

Answered   2023-09-20 20:23:04

One of the ways to kill a process on a port is to use the python library: freeport (https://pypi.python.org/pypi/freeport/0.1.9) . Once installed, simply:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully

Answered   2023-09-20 20:23:04

  • That's, by far, NOT the simplest way. The upvoted replies don't require you to download and install anything. - anyone
  • When the prerequisites are met this is so simple and easy to remember. We have a different definition of "simplest" and this answer is perfectly valid and appropriate. Maybe it's just missing the instructions to install freeport with pip. - anyone
  • under the hood, freeport is just a wrapper that calls lsof -t -i:3000.. seems unnecessary. - anyone
  • This solution is not the easiest, but it complies 100% with what the OP asked... So it is in deed valid AF - anyone

To view the processes blocking the port:

netstat -vanp tcp | grep 3000

To Kill the processes blocking the port:

kill $(lsof -t -i :3000)

Answered   2023-09-20 20:23:04

  • This won't work on a Mac machine, returns the following: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec] It will, however, work in most linux distros - anyone
  • @MilanVelebit Actually it works perfectly in my Mac machine (Sierra). It works fine if your port 3000 is occupied. However if no processes is blocking the port, then you will get kill: not enough arguments error. - anyone
  • That's just weird, I've two Macs (both High Sierra tho), I remember running those commands on both of them (old habits) and I know for certain that they don't run. I've just tried it again on my machine, knowing that the port is occupied, same error. :/ - anyone
  • Did you get a valid PID on running netstat -vanp tcp | grep 3000, for your port that's occupied? - anyone
  • I tried it in both bash and zsh shell. Works fine for me. Not sure why it's not working for you. May be some thing to with High Sierra? I have no idea :/ - anyone

Find and kill:

This single command line is easy and works correctly.

kill -9 $(lsof -ti tcp:3000)

Answered   2023-09-20 20:23:04

Find the open connection

lsof -i -P | grep -i "listen"

Kill by process ID

kill -9 'PID'

Answered   2023-09-20 20:23:04

Possible ways to achieve this:

top

The top command is the traditional way to view your system’s resource usage and see the processes that are taking up the most system resources. Top displays a list of processes, with the ones using the most CPU at the top.

ps

The ps command lists running processes. The following command lists all processes running on your system:

ps -A

You could also pipe the output through grep to search for a specific process without using any other commands. The following command would search for the Firefox process:

ps -A | grep firefox

The most common way of passing signals to a program is with the kill command.

kill PID_of_target_process

lsof

List of all open files and the processes that opened them.

lsof -i -P | grep -i "listen"
kill -9 PID

or

 lsof -i tcp:3000 

Answered   2023-09-20 20:23:04

lsof -i tcp:port_number - will list the process running on that port

kill -9 PID - will kill the process

in your case, it will be

lsof -i tcp:3000 from your terminal find the PID of process

kill -9 PID

Answered   2023-09-20 20:23:04

I made a little function for this, add it to your rc file (.bashrc, .zshrc or whatever)

function kill-by-port {
  if [ "$1" != "" ]
  then
    kill -9 $(lsof -ni tcp:"$1" | awk 'FNR==2{print $2}')
  else
    echo "Missing argument! Usage: kill-by-port $PORT"
  fi
}

then you can just type kill-by-port 3000 to kill your rails server (substituting 3000 for whatever port it's running on)

failing that, you could always just type kill -9 $(cat tmp/pids/server.pid) from the rails root directory

Answered   2023-09-20 20:23:04

  • I had to backslash \$PORT to get the message to display correctly. Otherwise, works great! - anyone

These two commands will help you find and kill server process

  1. lsof -wni tcp:3000
  2. kill -9 pid

Answered   2023-09-20 20:23:04

kill -9 $(lsof -ti:3000)

works for me on macOS always.

If you're working on a node.js project, you can add it to package.json scripts like;

"scripts": {
    ...
    "killme": "kill -9 $(lsof -ti:3000)",
    ...
  },

then

npm run killme

--

Also if you want to add system wide alias for your macOS, follow these steps;

Navigate to your home directory:

cd ~

Open up .bash_profile or zsh profile using nano or vim:

vi .bash_profile

Add an alias (press i):

alias killme="kill -9 $(lsof -ti:3000)"

save file

restart terminal

type killme to the terminal

Of course you can change port 3000 to what you want.

Answered   2023-09-20 20:23:04

Add to ~/.bash_profile:

function killTcpListen () {
  kill -QUIT $(sudo lsof -sTCP:LISTEN -i tcp:$1 -t)
}

Then source ~/.bash_profile and run

killTcpListen 8080

Answered   2023-09-20 20:23:04

Using sindresorhus's fkill tool, you can do this:

$ fkill :3000

Answered   2023-09-20 20:23:04

Works for me for terminating node (Mac OS Catalina)

killall -9 node

Answered   2023-09-20 20:23:04

TL;DR:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

If you're in a situation where there are both clients and servers using the port, e.g.:

$ lsof -i tcp:3000
COMMAND     PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node       2043 benjiegillam   21u  IPv4 0xb1b4330c68e5ad61      0t0  TCP localhost:3000->localhost:52557 (ESTABLISHED)
node       2043 benjiegillam   22u  IPv4 0xb1b4330c8d393021      0t0  TCP localhost:3000->localhost:52344 (ESTABLISHED)
node       2043 benjiegillam   25u  IPv4 0xb1b4330c8eaf16c1      0t0  TCP localhost:3000 (LISTEN)
Google    99004 benjiegillam  125u  IPv4 0xb1b4330c8bb05021      0t0  TCP localhost:52557->localhost:3000 (ESTABLISHED)
Google    99004 benjiegillam  216u  IPv4 0xb1b4330c8e5ea6c1      0t0  TCP localhost:52344->localhost:3000 (ESTABLISHED)

then you probably don't want to kill both.

In this situation you can use -sTCP:LISTEN to only show the pid of processes that are listening. Combining this with the -t terse format you can automatically kill the process:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill

Answered   2023-09-20 20:23:04

Here's a helper bash function to kill multiple processes by name or port

fkill() {
  for i in $@;do export q=$i;if [[ $i == :* ]];then lsof -i$i|sed -n '1!p';
  else ps aux|grep -i $i|grep -v grep;fi|awk '{print $2}'|\
  xargs -I@ sh -c 'kill -9 @&&printf "X %s->%s\n" $q @';done
}

Usage:

$ fkill [process name] [process port]

Example:

$ fkill someapp :8080 node :3333 :9000

Answered   2023-09-20 20:23:04

You can try this

netstat -vanp tcp | grep 3000

Answered   2023-09-20 20:23:04

I use:

lsof -wni tcp:3000

Get the PID, and:

kill -9 <PID>

Answered   2023-09-20 20:23:04

my fav one-liner: sudo kill `sudo lsof -t -i:3000`

Answered   2023-09-20 20:23:04

To kill port 3000 on mac, run the below command

kill -9 $(lsof -t -i:3000 -sTCP:LISTEN)

Answered   2023-09-20 20:23:04