Znajdź (i zabij) proces blokowania portu 3000 na komputerze Mac

1808

Jak znaleźć (i zabić) procesy, które nasłuchują / używają moich portów TCP? Jestem na Mac OS X.

Czasami po awarii lub błędzie moja aplikacja railsowa blokuje port 3000. Nie mogę go znaleźć przy pomocy ps -ef ...

Kiedy robisz

rails server

dostaję

Adres już używany - bind (2) (Errno :: EADDRINUSE)

Aktualizacja 2014:

Aby wypełnić niektóre z poniższych odpowiedzi: Po wykonaniu poleceń zabicia konieczne może być usunięcie pliku pid rm ~/mypath/myrailsapp/tmp/pids/server.pid

oma
źródło
25
Bardzo fajne rozwiązanie do zabicia procesu na DOWOLNYM porcie określonym przez użytkownika można znaleźć w odpowiedzi @Kevin Suttle poniżej. Reprodukcja tutaj dla potomności:function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
user456584 17.01.2014
4
Port 3000 nie jest „specyficzny dla rozwoju szyn” - Meteor natywnie działa również na 3000, i jestem pewien, że są inne.
gregorvand,
Powyższy komentarz @ user456584 powinien być zaakceptowaną odpowiedzią ^^^ Ta funkcja działała, aby zabić wiele procesów uruchomionych na porcie
Aneuway

Odpowiedzi:

3022
  1. Możesz spróbować netstat

    netstat -vanp tcp | grep 3000
    
  2. Dla MacOS El Capitan i nowszych (lub jeśli twój netstat nie obsługuje -p), użyjlsof

    sudo lsof -i tcp:3000 
    
  3. Do użytku z Centos 7

    netstat -vanp --tcp | grep 3000
    
ghostdog74
źródło
22
Dziękuję Ci! Twoja odpowiedź zrodziła mój skrypt „death_to” port. (#! / usr / bin / ruby lsof -t -i tcp:#{ARGV.first} | xargs kill)
Sv1
191
Flaga „terse” na lsof tworzy dane wyjściowe odpowiednie do potokowania do kolejnego zabicia:lsof -t -i tcp:1234 | xargs kill
Manav
5
Włożyłem to do mojego ~/.bash_profile: findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkillWięc teraz muszę tylko pisać killport 8080i to oszczędza mi kilka sekund
Alfonso Pérez
3
Kolejna wskazówka: koniecznie spróbuj sudoprzed lsof, jeśli nie widzisz żadnych wyników
Abe Petrillo
4
Kolejną wskazówką jest dodanie -Pdo lsofpolecenia, aby surowy port był widoczny w danych wyjściowych:lsof -P -i:3000
Jason Axelson
1874

Odnaleźć:

sudo lsof -i :3000

Zabić:

kill -9 <PID>
Filip Spiridonov
źródło
61
Czasami lsof -i: port nic nie pokazuje. spróbuj sudo lsof -i: port .
kilik52
31
Polecam spróbować kill -15 <PID>przed skorzystaniem z -9bezpieczeństwa.
Jamon Holmgren
7
@Jamon Holmgren dlaczego? co oboje robią? i dlaczego kill <PID>nie jest wystarczający / niebezpieczny / niekompletny?
Michael Trouw
13
@MichaelTrouw prawie rok później, ale oto twoja odpowiedź. :-) unix.stackexchange.com/a/8918 TL; DR kill -15daje procesowi szansę na posprzątanie po sobie.
Jamon Holmgren,
9
Myślę, że ta odpowiedź powinna powiedzieć, co -9robi.
Joseph Fraley
206

Nic powyżej nie działało dla mnie. Każda inna osoba z moim doświadczeniem może wypróbować następujące rozwiązania (dla mnie):

Biegać:

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

następnie sprawdź status zgłoszonego PID:

ps ax | grep <PID>

wreszcie „zacznij od tego”:

kill -QUIT <PID>
Austin
źródło
18
To wydaje się lepszą odpowiedzią niż ta udzielona znacznie później przez Filipa Spiridonova, który ma 277 głosów oddanych na twoje 9. Twoje było 6 miesięcy wcześniej i ma te same informacje z nieco większym wyjaśnieniem. Nie ma sprawiedliwości ...
Floris
Spróbuj kill -TERM(lub po prostu kill) wcześniej kill -QUIT. Nie każdy proces spowoduje uporządkowane zamknięcie systemu SIGQUIT.
craig65535
159

Jednowierszowy do wyodrębnienia PID procesu za pomocą portu 3000 i zabicia go.

lsof -ti:3000 | xargs kill

Flaga -t usuwa wszystko oprócz PID z wyjścia lsof, co ułatwia jego zabicie.

Zlemini
źródło
13
Możesz odfiltrować porty „nasłuchujące” za pomocą:lsof -ti:3000 -sTCP:LISTEN
Zlemini
1
Ta metoda działa najlepiej dla mnie. Prosta wkładka, która usuwa zajęty port. Dzięki!
Ryan Trainor,
137

Najłatwiejsze rozwiązanie :

Dla pojedynczego portu:

kill $(lsof -ti:3000)  #3000 is the port to be freed

Zabij wiele portów jednym poleceniem:

kill $(lsof -ti:3000,3001)  #here multiple ports 3000 and 3001 are the ports to be freed

lsof -ti: 3000

82500 (ID procesu / PID)

lsof -ti: 3001

82499

lsof -ti: 3001,3000

82499 82500

kill $ (lsof -ti: 3001,3000)

Kończy procesy 82499 i 82500 za pomocą jednego polecenia.

Aby użyć tego w package.jsonskryptach:

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

Abhijith Sasikumar
źródło
2
To zadziałało dla mnie Dzięki :)
DILEEP THOMAS
2
Cieszę się, że pomogło.
Abhijith Sasikumar,
113

Ta pojedyncza linia poleceń jest łatwa do zapamiętania:

npx kill-port 3000

Aby uzyskać bardziej wydajne narzędzie z wyszukiwaniem:

npx fkill-cli


PS: Używają zewnętrznych pakietów javascript. npxjest wbudowany w Node.js.

Źródła: tweet | github

Bruno Lemos
źródło
Czy możesz podzielić się szczegółami na temat instalowania npx za pomocą brew? Próbowałem zainstalować go na moim komputerze Mac High Sierra 10.13.3 i nie będzie działać.
realPK
@realPK npxjest dostarczany wraz npmz node.js, więc nie jest to oddzielny pakiet. Po prostu zaktualizuj wersje node.js i npm.
Bruno Lemos,
Zajmuję się głównie Javą, jeszcze nie wystawiłem się na Węzeł. Znalazłem inny sposób zabijania usługi działającej na porcie. TY za odpowiedź.
realPK
5
Potrzeba NodeJS i JavaScript, aby zabić coś działającego na porcie 3000, prawdopodobnie szyny ... wydaje mi się to zbyt duże. dodanie prostej linii do pliku .bashrc lub .zshrc za pomocą aliasu rozwiązałoby go bez potrzeby korzystania z Internetu. alias kill3000 = 'lsof -ti: 3000 | xargs kill ”, to możesz zrobić: kill3000
Khalil Gharbaoui
Najlepsze rozwiązanie tego problemu .. dzięki
King Rayhan
107

Możesz użyć lsof -i:3000.

To jest „Lista otwartych plików”. To daje listę procesów oraz używanych plików i portów.

DerMike
źródło
Jestem na krasnoludku 10.5 (zaktualizowane Q). Nie wiem, czy to ma znaczenie, ale lsof nie wyświetla portów. lsof-h (lsof 4.78) jest zbyt tajemniczy też ja ...
oma
1
Hmm Nie wiem na pewno o Leopardzie, ale spróbuj ( jako root - to chyba ważne) lsof -i:3000.
Matt Gibson
59

W swoim .bash_profileutwórz skrót do terminateprocesu 3000:

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

Następnie zadzwoń, $terminatejeśli jest zablokowany.

alexzg
źródło
12
Możesz uczynić to wystarczająco elastycznym dla dowolnego portu: github.com/kevinSuttle/dotfiles/commit/…
Kevin Suttle
I taka opisowa nazwa = p
Michael Peterson
Mam coś podobnego do tego, ale przechodzę przez port. Nazwę mojej funkcji KP na port zabicia.
Joseph Chambers
58

Aby siłą zabić taki proces, użyj następującego polecenia

lsof -n -i4TCP:3000 

Gdzie 3000 to numer portu, na którym działa proces

zwraca identyfikator procesu (PID) i uruchamia się

kill -9 "PID"

Zastąp PID numerem, który otrzymasz po uruchomieniu pierwszego polecenia

Na przykład, jeśli chcę zabić proces działający na porcie 8080

Tadele Ayelegn
źródło
38
lsof -P | grep ':3000' | awk '{print $2}'

To da ci tylko pid, przetestowany na MacOS.

Kris
źródło
10
na MAC zabij wszystkie pidy na porcie 3000: lsof -P | grep ': 3000' | awk '{print 2 USD}' | xargs kill -9
mike clagg
1
czy więcej niż jeden proces może nasłuchiwać na tym samym porcie?
Kris,
Nasza aplikacja szynowa spawnuje pracowników, którzy są procesami potomnymi, i muszę tego użyć, aby zabić osieroconych pracowników
Mike Clagg
2
zabija to również przeglądarek internetowych łączących się z portem
fjsj
5
Oto działający jeden:lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
Bob
29

Wykonaj w wierszu poleceń na OS-X El Captain:

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

Krótka opcja lsof zwraca tylko PID.

JE42
źródło
28

Jednym ze sposobów zabicia procesu na porcie jest użycie biblioteki python: freeport ( https://pypi.python.org/pypi/freeport/0.1.9 ). Po zainstalowaniu wystarczy:

# install freeport
pip install freeport

# Once freeport is installed, use it as follows
$ freeport 3000
Port 3000 is free. Process 16130 killed successfully
YBathia
źródło
7
To zdecydowanie NIE jest najprostszy sposób. Pozytywne odpowiedzi nie wymagają pobierania i instalowania czegokolwiek.
Greg Pasquariello,
4
Po spełnieniu warunków wstępnych jest to tak proste i łatwe do zapamiętania. Mamy inną definicję „najprostszego” i ta odpowiedź jest całkowicie poprawna i odpowiednia. Może po prostu brakuje instrukcji, aby zainstalować Freeport z pipem.
Cyril Duchon-Doris
pod maską, Freeport to tylko opakowanie, które wzywa lsof -t -i:3000... wydaje się niepotrzebne.
Corey Goldberg,
To rozwiązanie nie jest najłatwiejsze, ale jest w 100% zgodne z tym, o co poprosił OP ... Tak więc jest w rzeczywistości ważne AF
danielrvt
26

Aby wyświetlić procesy blokujące port:

netstat -vanp tcp | grep 3000

Aby zabić procesy blokujące port:

kill $(lsof -t -i :3000)

Henz
źródło
To nie będzie działać na komputerze Mac, zwraca następujące: kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]Będzie jednak działać w większości dystrybucji Linuksa
Milan Velebit
1
@MilanVelebit Właściwie to działa idealnie na moim komputerze Mac (Sierra). Działa dobrze, jeśli twój port 3000jest zajęty. Jeśli jednak żaden proces nie blokuje portu, pojawi się kill: not enough argumentsbłąd.
Henry,
To po prostu dziwne, mam dwa komputery Mac (oba w High Sierra tho), pamiętam uruchamianie tych poleceń na obu z nich (stare nawyki) i wiem na pewno, że nie działają. Właśnie spróbowałem ponownie na moim komputerze, wiedząc, że port jest zajęty, ten sam błąd. : /
Milan Velebit,
Czy dostałeś prawidłowy PID podczas działania netstat -vanp tcp | grep 3000dla swojego portu, który jest zajęty?
Henry,
1
Próbowałem zarówno bashi zshmuszli. Działa dobrze dla mnie. Nie jestem pewien, dlaczego to nie działa dla Ciebie. Może być coś z High Sierra? Nie mam pojęcia: /
Henry,
24

Znajdź otwarte połączenie

lsof -i -P | grep -i „Listen”

Zabij według identyfikatora procesu

zabij -9 „PID”

Sourabh Bhagat
źródło
20

Znajdź i zabij:

Ta pojedyncza linia poleceń jest łatwa i działa poprawnie.

kill -9 $(lsof -ti tcp:3000)
Dylan Breugne
źródło
14

Możliwe sposoby osiągnięcia tego celu:

Top

Najważniejsze polecenie to tradycyjny sposób wyświetlania wykorzystania zasobów systemu i sprawdzania procesów, które zajmują najwięcej zasobów systemu. Na górze wyświetla listę procesów, przy czym te, które wykorzystują najwięcej procesora na górze.

ps

Polecenie ps wyświetla listę uruchomionych procesów. Następujące polecenie wyświetla listę wszystkich procesów uruchomionych w systemie:

ps -A

Możesz także przesłać dane wyjściowe przez grep, aby wyszukać określony proces bez użycia innych poleceń. Następujące polecenie wyszuka proces Firefox:

ps -A | grep firefox

Najczęstszym sposobem przekazywania sygnałów do programu jest polecenie kill.

kill PID_of_target_process

lsof

Lista wszystkich otwartych plików i procesów, które je otworzyły.

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

lub

 lsof -i tcp:3000 
gładki
źródło
10

lsof -i tcp:port_number - wyświetli listę procesów uruchomionych na tym porcie

kill -9 PID - zabije proces

w twoim przypadku tak będzie

lsof -i tcp:3000 z terminala znajdź PID procesu

kill -9 PID

Shan
źródło
10

Te dwa polecenia pomogą ci znaleźć i zabić proces serwera

  1. lsof -wni tcp: 3000
  2. zabij -9 pid
Saif chaudhry
źródło
Cała przyjemność po mojej stronie, Aashiah
Saif chaudhry
5

Dodaj do ~/.bash_profile:

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

Potem source ~/.bash_profilei biegnij

killTcpListen 8080

rofrol
źródło
5

Korzystanie sindresorhus „s fkill narzędzie, można to zrobić:

$ fkill :3000
Kodie Grantham
źródło
4

TL; DR:

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

Jeśli jesteś w sytuacji, gdy z portu korzystają zarówno klienci, jak i serwery, np .:

$ 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)

wtedy prawdopodobnie nie chcesz zabić obu.

W tej sytuacji możesz użyć -sTCP:LISTENtylko do pokazania pid procesów, które nasłuchują. Łącząc to z -tkrótkim formatem, możesz automatycznie zabić proces:

lsof -ti tcp:3000 -sTCP:LISTEN | xargs kill
Benjie
źródło
4

Zrobiłem trochę tę funkcję, dodaj go do swojego pliku rc ( .bashrc, .zshrclub cokolwiek)

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
}

następnie możesz po prostu wpisać, kill-by-port 3000aby zabić serwer Railsów (zastępując 3000 za dowolny port, na którym działa)

jeśli to się nie powiedzie, zawsze możesz po prostu pisać kill -9 $(cat tmp/pids/server.pid)z katalogu głównego szyn

Caleb Keene
źródło
Musiałem odwrócić ukośnik, \$PORTaby komunikat wyświetlał się poprawnie. W przeciwnym razie działa świetnie!
ashwood
4

Aby zabić wiele portów.

$ npx kill-port 3000 8080 8081

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

Mam nadzieję, że to pomoże!

Binh Ho
źródło
1

Powinieneś spróbować, ta technika jest niezależna od systemu operacyjnego.

Z boku aplikacji znajduje się folder o nazwie tmp, wewnątrz którego znajduje się inny folder o nazwie pids. Ten plik zawiera plik pid serwera. Po prostu usuń ten plik. port sam się zabija.

Myślę, że to prosty sposób.

Arun P.
źródło
1

Oto funkcja bash pomocnika do zabicia wielu procesów według nazwy lub portu

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
}

Stosowanie:

$ fkill [process name] [process port]

Przykład:

$ fkill someapp :8080 node :3333 :9000
Miguel Mota
źródło
1

Możesz tego spróbować

netstat -vanp tcp | grep 3000
Foram Thakral
źródło
0

Jeśli chcesz skorzystać z kodu bez kodu - otwórz menedżera aktywności i wymuś węzeł kill :)

Hannah Carney
źródło
0

Używam tego:

cat tmp/pids/server.pid | pbcopy

Następnie kill -9 'paste'

Mihail hidr0 Kirilov
źródło
-1

Krok 1: Znajdź działający serwer: ps aux | grep puma Krok 2: Zabij ten serwer Zabij -9 [numer serwera]

Thiện Nguyễn
źródło
-1

W systemie Mac OS

kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')

Nic
źródło
1
Zostało to opublikowane jako komentarz 5 lat temu, a podobne odpowiedzi zostały opublikowane wiele razy.
Gilles Gouaillardet,