3035

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)
4
  • 44
    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 }
    – user456584
    Commented Jan 17, 2014 at 18:39
  • @user456584 's comment above should be the accepted answer ^^^ That function worked to kill the many processes i had running on a port Commented Jun 19, 2019 at 15:12
  • works after finding processes with netstat and killing the process with kill -9 command!
    – Gaurav
    Commented Apr 8, 2021 at 15:39
  • 20
    @richardec kill -9 $(lsof -ti:3000) not working? Commented Jan 18, 2022 at 9:49

40 Answers 40

4732

For macOS El Capitan and newer (or if your netstat doesn't support -p), use lsof:

lsof -i tcp:3000

Alternatively, you can use netstat:

netstat -vanp tcp | grep 3000

Once you have the PID (Process ID) use:

kill -9 <PID>
17
  • 56
    Thank you! Your answer gave birth to my "death_to 'port'" script. (#!/usr/bin/ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
    – Sv1
    Commented Oct 2, 2013 at 18:40
  • 342
    The "terse" flag to lsof produces output suitable for piping to a subsequent kill: lsof -t -i tcp:1234 | xargs kill
    – Manav
    Commented Jan 7, 2014 at 4:58
  • 21
    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 Commented Nov 11, 2015 at 13:51
  • 9
    Another tip is to add -P to the lsof command so that the raw port is visible in the output: lsof -P -i:3000 Commented Jul 22, 2016 at 2:06
  • 33
    This post is only half the answer
    – png
    Commented Mar 24, 2020 at 17:10
3344

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.

17
  • 97
    Sometimes lsof -i :port will show nothing. try sudo lsof -i :port.
    – kilik52
    Commented Jan 30, 2014 at 12:05
  • 69
    Recommend trying kill -15 <PID> before resorting to -9 for safety. Commented Aug 16, 2015 at 23:55
  • 26
    @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. Commented Oct 12, 2016 at 5:57
  • 31
    I think this answer should say what -9 does. Commented Jan 17, 2017 at 19:13
  • 20
    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.
    – niels
    Commented Jan 26, 2017 at 11:58
1193
+500

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
9
  • 5
    This should be the best solution. Does both find AND kill in one short, simple command :)
    – Dotl
    Commented Jul 22, 2021 at 10:02
  • 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?
    – Dan Yishai
    Commented Oct 7, 2021 at 11:50
  • Try: $(lsof -ti:3000) && kill -9 $(lsof -ti:3000) Commented Oct 8, 2021 at 6:23
  • 2
    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
    – devasghar
    Commented Feb 9, 2022 at 20:23
  • I tried this oneliner but I got the following: kill: not enough arguments
    – Yvan Rugwe
    Commented Feb 17, 2022 at 13:45
319

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>
2
  • 35
    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...
    – Floris
    Commented Dec 30, 2015 at 22:15
  • 2
    Try kill -TERM (or just kill) before kill -QUIT. Not every process is going to do an orderly shutdown on SIGQUIT.
    – craig65535
    Commented Jan 21, 2020 at 0:09
210

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

5
  • 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.
    – realPK
    Commented Oct 11, 2018 at 22:44
  • 1
    @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. Commented Oct 12, 2018 at 8:40
  • 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.
    – realPK
    Commented Oct 13, 2018 at 22:58
  • 13
    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 Commented Jan 9, 2019 at 11:19
  • 1
    works flawlessly!
    – Gaurav
    Commented Aug 25, 2022 at 14:37
197

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.

3
  • 14
    You can filter out "listening" ports with: lsof -ti:3000 -sTCP:LISTEN
    – Zlemini
    Commented May 22, 2018 at 21:58
  • 2
    This method works best for me. Simple one liner that clears the busy port. Thanks! Commented Dec 3, 2019 at 20:34
  • 1
    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; } Commented Mar 17, 2023 at 11:47
175

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.

1
  • This is a great way to find it, can you update your answer to include the easiest way to kill the command?
    – CWSites
    Commented Apr 19, 2023 at 17:39
82

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

What to do if you could not find PID of a process with lsof -i:PID? log in as a super user with sudo su and run lsof -i:PID again

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 execute kill -9 PID

1
  • 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:
    – fotoflo
    Commented Dec 14, 2020 at 10:43
67

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.

3
63

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!

3
  • How about using npx to find running ports? Commented Jun 9, 2021 at 7:26
  • 1
    Npx seems support detect port like 'npx detect-port 8080'. But seems not supporting find all running ports.
    – Binh Ho
    Commented Jun 16, 2021 at 6:19
  • 1
    this is the best because it's easy to remember
    – ICW
    Commented Apr 29, 2023 at 19:47
50
lsof -P | grep ':3000' | awk '{print $2}'

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

5
  • 13
    on MAC kill all pids on port 3000: lsof -P | grep ':3000' | awk '{print $2}' | xargs kill -9
    – mike clagg
    Commented May 13, 2013 at 21:18
  • 1
    can more than one process listen to the same port?
    – Kris
    Commented May 15, 2013 at 16:16
  • Our rails app spawns workers which are child processes, and I have to use this to kill orphaned workers
    – mike clagg
    Commented May 15, 2013 at 18:19
  • 2
    this also kills webbrowsers connecting to port
    – fjsj
    Commented Apr 27, 2015 at 15:06
  • 6
    Here is working one: lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
    – bob
    Commented May 23, 2016 at 11:19
39

Execute in command line on OS-X El Captain:

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

Terse option of lsof returns just the PID.

0
33

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
4
  • 7
    That's, by far, NOT the simplest way. The upvoted replies don't require you to download and install anything. Commented May 25, 2016 at 19:20
  • 4
    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. Commented Jul 19, 2017 at 15:18
  • under the hood, freeport is just a wrapper that calls lsof -t -i:3000.. seems unnecessary. Commented Nov 16, 2018 at 17:01
  • 1
    This solution is not the easiest, but it complies 100% with what the OP asked... So it is in deed valid AF
    – danielrvt
    Commented Nov 21, 2018 at 15:11
33

To view the processes blocking the port:

netstat -vanp tcp | grep 3000

To Kill the processes blocking the port:

kill $(lsof -t -i :3000)

7
  • 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 Commented Sep 19, 2018 at 12:08
  • 1
    @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.
    – Henry
    Commented Sep 19, 2018 at 14:24
  • 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. :/ Commented Sep 19, 2018 at 14:33
  • Did you get a valid PID on running netstat -vanp tcp | grep 3000, for your port that's occupied?
    – Henry
    Commented Sep 19, 2018 at 14:46
  • 1
    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 :/
    – Henry
    Commented Sep 19, 2018 at 15:27
28

Find and kill:

This single command line is easy and works correctly.

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

Find the open connection

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

Kill by process ID

kill -9 'PID'

0
18

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 
13

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

12

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

1
  • 1
    I had to backslash \$PORT to get the message to display correctly. Otherwise, works great!
    – rosalynnas
    Commented Mar 17, 2019 at 20:24
12

These two commands will help you find and kill server process

  1. lsof -wni tcp:3000
  2. kill -9 pid
1
  • My pleasure, Aashiah Commented Aug 24, 2019 at 15:16
10
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.

8

Add to ~/.bash_profile or ~/.zshrc:

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

Then source ~/.bash_profile or source ~/.zshrc and run

killTcpListen 8080

6

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

$ fkill :3000
5

Works for me for terminating node (Mac OS Catalina)

killall -9 node
4

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
4

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

1
  • This command is working for me in mac Commented Jun 4 at 8:12
4

just write on terminal

sudo kill -9 $(lsof -i :3000 -t)

hope , it's work.

3

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
3

You can try this

netstat -vanp tcp | grep 3000
0
3

I use:

lsof -wni tcp:3000

Get the PID, and:

kill -9 <PID>

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