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


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
    

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>

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>

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.


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" }


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


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.


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.


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


38
lsof -P | grep ':3000' | awk '{print $2}'

To da ci tylko pid, przetestowany na MacOS.


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.


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

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)


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”


20

Znajdź i zabij:

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

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

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 

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



5

Dodaj do ~/.bash_profile:

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

Potem source ~/.bash_profilei biegnij

killTcpListen 8080



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

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


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!


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.


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


0

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



-1

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


-1

W systemie Mac OS

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


1
Zostało to opublikowane jako komentarz 5 lat temu, a podobne odpowiedzi zostały opublikowane wiele razy.
Gilles Gouaillardet,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.