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)
function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
- anyone kill -9 $(lsof -ti:3000)
not working? - anyone 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
Answered 2023-09-20 20:23:04
lsof -t -i tcp:#{ARGV.first} | xargs kill
) - anyone lsof -t -i tcp:1234 | xargs kill
- anyone ~/.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 -P
to the lsof
command so that the raw port is visible in the output: lsof -P -i:3000
- 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
kill -15 <PID>
before resorting to -9
for safety. - anyone kill -15
gives the process a chance to clean up after itself. - anyone -9
does. - anyone 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
$(lsof -ti:3000) && kill -9 $(lsof -ti:3000)
- anyone brew tap devasghar/portkill && brew install devasghar/portkill/homebrew-portkill
then you can do portkill 3000
& for multiple ports portkill 3000,3001
- anyone 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
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.
Answered 2023-09-20 20:23:04
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 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
lsof -ti:3000 -sTCP:LISTEN
- anyone 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
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
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
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
npx
to find running ports? - 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
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
lsof -t -i:3000
.. seems unnecessary. - 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
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
It will, however, work in most linux distros - anyone 3000
is occupied. However if no processes is blocking the port, then you will get kill: not enough arguments
error. - anyone netstat -vanp tcp | grep 3000
, for your port that's occupied? - anyone 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
\$PORT
to get the message to display correctly. Otherwise, works great! - anyone These two commands will help you find and kill server process
- lsof -wni tcp:3000
- 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
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
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