ChatGPT解决这个技术问题 Extra ChatGPT

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

Closed. This question does not meet Stack Overflow guidelines. It is not currently accepting answers. We don’t allow questions about general computing hardware and software on Stack Overflow. You can edit the question so it’s on-topic for Stack Overflow. Closed 6 months ago. The community reviewed whether to reopen this question 15 days ago and left it closed: Original close reason(s) were not resolved Improve this question

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 }
@user456584 's comment above should be the accepted answer ^^^ That function worked to kill the many processes i had running on a port
works after finding processes with netstat and killing the process with kill -9 command!
@richardec kill -9 $(lsof -ti:3000) not working?

F
Frenchcooc

You can try netstat netstat -vanp tcp | grep 3000 For macOS El Capitan and newer (or if your netstat doesn't support -p), use lsof lsof -i tcp:3000 For Centos 7 use: netstat -vanp --tcp | grep 3000


Thank you! Your answer gave birth to my "death_to 'port'" script. (#!/usr/bin/ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
The "terse" flag to lsof produces output suitable for piping to a subsequent kill: lsof -t -i tcp:1234 | xargs kill
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
Another tip is to add -P to the lsof command so that the raw port is visible in the output: lsof -P -i:3000
This post is only half the answer
U
Ulf Aslak

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.


Sometimes lsof -i :port will show nothing. try sudo lsof -i :port.
Recommend trying kill -15 <PID> before resorting to -9 for safety.
@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.
I think this answer should say what -9 does.
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.
A
Abhijith Sasikumar

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 prot is occupied, thie 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

This should be the best solution. Does both find AND kill in one short, simple command :)
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?
Try: $(lsof -ti:3000) && kill -9 $(lsof -ti:3000)
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
I tried this oneliner but I got the following: kill: not enough arguments
j
jmort253

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>

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...
Try kill -TERM (or just kill) before kill -QUIT. Not every process is going to do an orderly shutdown on SIGQUIT.
Z
Zlemini

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.


You can filter out "listening" ports with: lsof -ti:3000 -sTCP:LISTEN
This method works best for me. Simple one liner that clears the busy port. Thanks!
B
Bruno Lemos

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


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 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.
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.
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
a
alex

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.


T
Tadele Ayelegn

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

https://i.stack.imgur.com/TrsWh.png

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


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:
a
alex

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.


You can make this flexible enough for any port: github.com/kevinSuttle/dotfiles/commit/…
And such a descriptive name =p
I have something similar to this but I pass in the port. I named my function KP for kill port.
B
Binh Ho

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!


How about using npx to find running ports?
Npx seems support detect port like 'npx detect-port 8080'. But seems not supporting find all running ports.
K
Kris
lsof -P | grep ':3000' | awk '{print $2}'

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


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

Execute in command line on OS-X El Captain:

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

Terse option of lsof returns just the PID.


Y
YBathia

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

That's, by far, NOT the simplest way. The upvoted replies don't require you to download and install anything.
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.
under the hood, freeport is just a wrapper that calls lsof -t -i:3000.. seems unnecessary.
This solution is not the easiest, but it complies 100% with what the OP asked... So it is in deed valid AF
H
Henry

To view the processes blocking the port:

netstat -vanp tcp | grep 3000

To Kill the processes blocking the port:

kill $(lsof -t -i :3000)


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
@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.
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. :/
Did you get a valid PID on running netstat -vanp tcp | grep 3000, for your port that's occupied?
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 :/
D
Dylan Breugne

Find and kill:

This single command line is easy and works correctly.

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

S
Sourabh Bhagat

Find the open connection

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

Kill by process ID

kill -9 'PID'


s
smooth

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 

S
Shan

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


A
Akj

These two commands will help you find and kill server process

lsof -wni tcp:3000 kill -9 pid


My pleasure, Aashiah
C
Caleb Keene

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


I had to backslash \$PORT to get the message to display correctly. Otherwise, works great!
h
hakkikonu
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.


r
rofrol

Add to ~/.bash_profile:

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

Then source ~/.bash_profile and run

killTcpListen 8080


K
Kodie Grantham

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

$ fkill :3000

A
Abdul Saleem

Works for me for terminating node (Mac OS Catalina)

killall -9 node

B
Benjie

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

M
Miguel Mota

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

F
Foram

You can try this

netstat -vanp tcp | grep 3000

S
Sahu

I use:

lsof -wni tcp:3000

Get the PID, and:

kill -9 <PID>


i
inexcitus

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


S
Sachin

To kill port 3000 on mac, run the below command

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