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
function killport() { lsof -i TCP:$1 | grep LISTEN | awk '{print $2}' | xargs kill -9 }
Odpowiedzi:
Możesz spróbować
netstat
Dla MacOS El Capitan i nowszych (lub jeśli twój netstat nie obsługuje
-p
), użyjlsof
Do użytku z Centos 7
źródło
lsof -t -i tcp:#{ARGV.first} | xargs kill
)lsof -t -i tcp:1234 | xargs kill
~/.bash_profile
:findandkill() { port=$(lsof -n -i4TCP:$1 | grep LISTEN | awk '{ print $2 }') kill -9 $port } alias killport=findandkill
Więc teraz muszę tylko pisaćkillport 8080
i to oszczędza mi kilka sekundsudo
przed lsof, jeśli nie widzisz żadnych wyników-P
dolsof
polecenia, aby surowy port był widoczny w danych wyjściowych:lsof -P -i:3000
Odnaleźć:
Zabić:
źródło
kill -15 <PID>
przed skorzystaniem z-9
bezpieczeństwa.kill <PID>
nie jest wystarczający / niebezpieczny / niekompletny?kill -15
daje procesowi szansę na posprzątanie po sobie.-9
robi.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ć:
następnie sprawdź status zgłoszonego PID:
wreszcie „zacznij od tego”:
źródło
kill -TERM
(lub po prostukill
) wcześniejkill -QUIT
. Nie każdy proces spowoduje uporządkowane zamknięcie systemu SIGQUIT.Jednowierszowy do wyodrębnienia PID procesu za pomocą portu 3000 i zabicia go.
Flaga -t usuwa wszystko oprócz PID z wyjścia lsof, co ułatwia jego zabicie.
źródło
lsof -ti:3000 -sTCP:LISTEN
Najłatwiejsze rozwiązanie :
Dla pojedynczego portu:
Zabij wiele portów jednym poleceniem:
82500 (ID procesu / PID)
82499
82499 82500
Kończy procesy 82499 i 82500 za pomocą jednego polecenia.
Aby użyć tego w
package.json
skryptach:"scripts": { "start": "kill $(lsof -ti:3000,3001) && npm start" }
źródło
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.
npx
jest wbudowany w Node.js.Źródła: tweet | github
źródło
npx
jest dostarczany wraznpm
znode.js
, więc nie jest to oddzielny pakiet. Po prostu zaktualizuj wersje node.js i npm.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.
źródło
lsof -i:3000
.W swoim
.bash_profile
utwórz skrót doterminate
procesu 3000:Następnie zadzwoń,
$terminate
jeśli jest zablokowany.źródło
Aby siłą zabić taki proces, użyj następującego polecenia
Gdzie 3000 to numer portu, na którym działa proces
zwraca identyfikator procesu (PID) i uruchamia się
Zastąp PID numerem, który otrzymasz po uruchomieniu pierwszego polecenia
źródło
To da ci tylko pid, przetestowany na MacOS.
źródło
lsof -n -iTCP:3407 -sTCP:LISTEN -n -l -P | grep 'LISTEN' | awk '{print $2}' | xargs kill -9
Wykonaj w wierszu poleceń na OS-X El Captain:
Krótka opcja lsof zwraca tylko PID.
źródło
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:
źródło
lsof -t -i:3000
... wydaje się niepotrzebne.Aby wyświetlić procesy blokujące port:
netstat -vanp tcp | grep 3000
Aby zabić procesy blokujące port:
kill $(lsof -t -i :3000)
źródło
kill: usage: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... or kill -l [sigspec]
Będzie jednak działać w większości dystrybucji Linuksa3000
jest zajęty. Jeśli jednak żaden proces nie blokuje portu, pojawi siękill: not enough arguments
błąd.netstat -vanp tcp | grep 3000
dla swojego portu, który jest zajęty?bash
izsh
muszli. 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: /Znajdź otwarte połączenie
Zabij według identyfikatora procesu
źródło
Znajdź i zabij:
Ta pojedyncza linia poleceń jest łatwa i działa poprawnie.
źródło
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:
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:
Najczęstszym sposobem przekazywania sygnałów do programu jest polecenie kill.
lsof
Lista wszystkich otwartych plików i procesów, które je otworzyły.
lub
źródło
lsof -i tcp:port_number
- wyświetli listę procesów uruchomionych na tym porciekill -9 PID
- zabije procesw twoim przypadku tak będzie
lsof -i tcp:3000
z terminala znajdź PID procesukill -9 PID
źródło
Te dwa polecenia pomogą ci znaleźć i zabić proces serwera
źródło
Dodaj do
~/.bash_profile
:Potem
source ~/.bash_profile
i biegnijkillTcpListen 8080
źródło
Korzystanie sindresorhus „s fkill narzędzie, można to zrobić:
źródło
TL; DR:
Jeśli jesteś w sytuacji, gdy z portu korzystają zarówno klienci, jak i serwery, np .:
wtedy prawdopodobnie nie chcesz zabić obu.
W tej sytuacji możesz użyć
-sTCP:LISTEN
tylko do pokazania pid procesów, które nasłuchują. Łącząc to z-t
krótkim formatem, możesz automatycznie zabić proces:źródło
Zrobiłem trochę tę funkcję, dodaj go do swojego pliku rc (
.bashrc
,.zshrc
lub cokolwiek)następnie możesz po prostu wpisać,
kill-by-port 3000
aby 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źródło
\$PORT
aby komunikat wyświetlał się poprawnie. W przeciwnym razie działa świetnie!Aby zabić wiele portów.
Mam nadzieję, że to pomoże!
źródło
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.
źródło
Oto funkcja bash pomocnika do zabicia wielu procesów według nazwy lub portu
Stosowanie:
Przykład:
źródło
Możesz tego spróbować
źródło
Jeśli chcesz skorzystać z kodu bez kodu - otwórz menedżera aktywności i wymuś węzeł kill :)
źródło
Używam tego:
cat tmp/pids/server.pid | pbcopy
Następnie
kill -9 'paste'
źródło
Krok 1: Znajdź działający serwer:
ps aux | grep puma
Krok 2: Zabij ten serwer Zabij -9 [numer serwera]źródło
W systemie Mac OS
kill -9 $(lsof -i TCP:3000 | grep LISTEN | awk '{print $2}')
źródło