Jak zabić proces działający na określonym porcie w systemie Linux?

Próbowałem zamknąć Tomcat przy użyciu ./shutdown.sh z katalogu Tomcat /bin. Okazało się jednak, że serwer nie został prawidłowo zamknięty. Dlatego nie mogłem uruchomić ponownie
Mój Tomcat działa na porcie 8080.

Chcę zabić proces Tomcat działający na 8080. Najpierw chcę mieć listę procesów działających na określonym porcie (8080), aby wybrać proces do zabicia.


person veer7    schedule 20.07.2012    source źródło
comment
możliwy duplikat skryptu powłoki w celu zakończenia procesu nasłuchującego na porcie 3000?   -  person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 14.10.2014


Odpowiedzi (31)


To fuser 8080/tcp wydrukuje PID procesu powiązanego z tym portem.

A to fuser -k 8080/tcp zabije ten proces.

Działa tylko na Linuksie. Bardziej uniwersalne jest użycie lsof -i4 (lub 6 dla IPv6).

person nudzo    schedule 21.07.2012
comment
czy zamyka to również możliwe podłączone gniazdo do 8080? - person fer y; 28.01.2014
comment
Oczywiście wszystkie deskryptory plików są zamykane po zakończeniu procesu. - person nudzo; 29.01.2014
comment
Nie zamyka prawidłowo portu. Po zabiciu procesu nadrzędnego port zostaje wprowadzony w stan TIME_WAIT. System operacyjny ostatecznie całkowicie zamknie port po około 60 sekundach. Oznacza to, że nie możesz ponownie użyć portu przez co najmniej 60 sekund (chyba, że ​​dasz gniazdu opcję ponownego użycia). - person Mark Lakata; 04.09.2015
comment
W systemie Darwin musi używać innej wersji fuser. Pobiera tylko plik, nie obsługuje -k. - person a p; 15.11.2016
comment
„fuser -k -n tcp 8080” również zakończy proces - person Hesham Yassin; 09.02.2017
comment
@dbliss utrwalacz jest częścią psmisc. Jeśli otrzymasz fuser: command not found, zainstaluj psmisc. W przypadku CentOS/RHEL 7 uruchom sudo yum install psmisc - person Tom; 10.01.2019

Aby wyświetlić listę procesów nasłuchujących na porcie 8080:

lsof -i:8080

Aby zabić dowolny proces nasłuchujący na porcie 8080:

kill $(lsof -t -i:8080)

lub bardziej gwałtownie:

kill -9 $(lsof -t -i:8080)

(-9 odpowiada sygnałowi SIGKILL - terminate immediately/hard kill: zobacz List of Kill Signals i Jaki jest cel opcji -9 w poleceniu kill?. Jeśli dla kill nie określono żadnego sygnału, wysyłany jest sygnał TERM, czyli -15 lub soft kill, co czasami nie jest nie wystarczy, aby zabić proces.).

person Franck Dernoncourt    schedule 15.09.2015
comment
zabić: użycie: zabić [-s sigspec | -n znak | -sigspec] pid | jobspec ... lub kill -l [sigspec] Oto co otrzymuję, gdy wykonuję twoje polecenia - person Sudhir Belagali; 05.04.2017
comment
@SudhirBelagali zrobiłeś to z superużytkownikiem sudo - person Marcel Djaman; 11.05.2017
comment
Działało również na moim Macu - person asherbar; 07.01.2018
comment
Chciałbym dodać, że czasami nie masz uprawnień, aby zobaczyć identyfikator procesu, w takim przypadku musisz wykonać sudo lsof -i:8080. - person Akavall; 19.08.2018
comment
dlaczego druga wskazówka jest bardziej brutalna? - person Webwoman; 17.09.2018
comment
@Webman bardziej gwałtownie oznacza, że ​​​​zabija moją przeglądarkę internetową :( Oto najlepsze rozwiązanie od Gal Bracha: kill -9 $(lsof -t -i:3000 -sTCP:LISTEN) - person Russo; 20.09.2018
comment
@Webman -9 odpowiada SIGKILL - terminate immediately/hard kill: zobacz Listę sygnałów zabicia i Do czego służy opcja -9 w poleceniu kill?) - person Franck Dernoncourt; 20.09.2018
comment
na tej podstawie za pomocą Sudo: killport() {sudo kill -9 $(sudo lsof -t -i:${1} -sTCP:LISTEN)}, a następnie killport 8080 - person Nicolas Marshall; 08.01.2019

Użyj polecenia

 sudo netstat -plten |grep java

używany grep java jako tomcat używa java jako swoich procesów.

Wyświetli listę procesów z numerem portu i identyfikatorem procesu

tcp6       0      0 :::8080                 :::*                    LISTEN      
1000       30070621    16085/java

liczba przed /java to identyfikator procesu. Teraz użyj polecenia kill, aby zakończyć proces

kill -9 16085

-9 oznacza, że ​​proces zostanie zabity w sposób wymuszony.

person veer7    schedule 20.07.2012
comment
Możesz dodać, że do uzyskania nazw procesów za pośrednictwem netstat mogą być potrzebne uprawnienia roota. - person Jonas Schäfer; 20.07.2012
comment
@JonasWielicki możesz zobaczyć te, które posiadasz, bez uprawnień roota. - person dbliss; 09.08.2016
comment
Potrzebowałem uprawnień roota do netstat. Czy istnieje sposób, aby dowiedzieć się, z czego pochodzi ten proces? O ile wiem, zamknąłem wszystkie aplikacje, ale mogło się to zdarzyć w oknie terminala, w którym niechcący przesunąłem procesy do zadania w tle. Może powinienem był uruchomić polecenie terminala „ps”, aby najpierw zobaczyć wszystkie procesy… - person JesseBoyd; 12.10.2017
comment
sudo netstat -plten | grep :8080 zadziała nawet wtedy, gdy nie znasz aplikacji. Znaleziono proces Ruby, którego lsof -i nie udało mi się znaleźć. - person MikeF; 01.10.2020

Opcja 1 Jedna linijka, która zabija tylko SŁUCHAJ na określonym porcie:

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

Opcja 2 Jeśli masz zainstalowany npm, możesz także uruchomić

npx kill-port 3000
person Gal Bracha    schedule 22.01.2017
comment
Myślę, że to powinna być najlepsza odpowiedź. Dziękuję @Gal Bracha - person Sam Kah Chiin; 22.02.2018
comment
To najlepsze rozwiązanie, ponieważ nie zabija również mojej przeglądarki! - person Russo; 20.09.2018
comment
Na podstawie tej odpowiedzi stworzyłem funkcję w ~/.bashrc: killp() { kill -9 $(lsof -t -i:"$1" -sTCP:LISTEN) }, aby móc z niej korzystać w ten sposób killp 3000. (Nie zapomnij dodać nowych linii dla { }) - person Arthur; 06.08.2020

Możesz użyć polecenia lsof. Niech numer portu taki jak tutaj to 8090

lsof -i:8090

To polecenie zwraca listę otwartych procesów na tym porcie.

Coś jak…

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ssh 75782 eoin 5u IPv6 0x01c1c234 0t0 TCP localhost:8090 (LISTEN)

Aby zwolnić port, zabij proces, który go używa (identyfikator procesu to 75782)…

kill -9 75782

Ten zadziałał dla mnie. oto link z oryginalnego postu: link

person Kop4lyf    schedule 11.02.2015
comment
aby wymusić zakończenie procesu, będziesz musiał użyć opcji -9, np. kill -9 75782; ponieważ czasami kilka procesów nie jest zabijanych za pomocą po prostu zabijania - person veer7; 25.02.2015

Jedna linijka

kill -9 $(lsof -t -i tcp:8080)

Wyjaśnienie tutaj: użyj kombinacji lsof i kill

root@localhost:~# lsof -i tcp:8080
COMMAND   PID USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
java    23672 sine  238u  IPv6 3028222      0t0  TCP localhost:http-alt (LISTEN)

wybierz pid i użyj kill

kill 23672
person dlmeetei    schedule 26.11.2019

Jeśli chcesz zabić proces działający na porcie o numerze 8080, najpierw musisz znaleźć numer identyfikacyjny procesu portu 8080 (PID), a następnie go zabić. Uruchom następujące polecenie, aby znaleźć PID numeru portu 8080:

sudo lsof -t -i:8080

Tutaj,

  • sudo - polecenie pytające o uprawnienia administratora (identyfikator użytkownika i hasło).
  • lsof – lista plików (używana również do wyświetlania powiązanych procesów)
  • -t – pokaż tylko identyfikator procesu
  • -i - pokazuje tylko proces związany z połączeniami internetowymi
  • :8080 – pokaż tylko procesy na tym numerze portu

Możesz teraz łatwo zabić swój PID za pomocą następującego polecenia:

sudo kill -9 <PID>

Tutaj,

  • kill - polecenie zabicia procesu
  • -9 - na siłę

Możesz użyć jednego polecenia, aby zabić proces na określonym porcie, używając następującego polecenia:

sudo kill -9 $(sudo lsof -t -i:8080)

Więcej informacji można znaleźć pod następującym linkiem Jak zabić proces na określonym porcie w systemie Linux

person Mahfuz    schedule 18.05.2018
comment
dzięki stary. sudo kill -9 $(sudo lsof -t -i:8080) zadziałało dla mnie - person Junaid; 31.12.2018
comment
Świetnie, to polecenie zadziałało w moim przypadku, Ubuntu - person Jose Mhlanga; 08.04.2021

Najlepszy sposób na zabicie wszystkich procesów na określonym porcie;

kill -9 $(sudo lsof -t -i:8080)
person Berkay Kırmızıoğlu    schedule 04.12.2019
comment
nie wyświetla sudo monitu o podanie hasła - person Kuldeep Yadav; 21.04.2020

Spowoduje to wypisanie na standardowe wyjście identyfikatorów procesów wszystkich uruchomionych na <port_number>:

fuser -n tcp <port_number> 

Wypisuje także pewne rzeczy na stderr, więc:

fuser -n tcp <port_number> 2> /dev/null

Możemy następnie dostarczyć te identyfikatory procesów do polecenia kill:

sudo kill $(fuser -n tcp <port_number> 2> /dev/null)

Możesz także umieścić to w funkcji, jeśli robisz to często:

function killport() {
    sudo kill $(fuser -n tcp $1 2> /dev/null)
}
person Brian Peterson    schedule 27.09.2013

Aby poznać pid usługi działającej na konkretnym porcie:

netstat -tulnap | grep :*port_num*

otrzymasz opis tego procesu. Teraz użyj kill lub kill -9 pid. Łatwo zabić.

e.g

netstat -ap | grep :8080

tcp6       0      0 :::8080       :::*    LISTEN      1880/java 

Teraz:

kill -9 1880

Pamiętaj, aby uruchamiać wszystkie polecenia jako root

person Sanjay s.    schedule 12.08.2014

Uzyskaj PID zadania i zabij go.

lsof -ti:8080 | xargs kill
person Rahul Garg    schedule 29.11.2018
comment
Dziękuję za odpowiedź. Bardzo płynnie działa w systemie Mac OS. Jesteś najlepsza. Po prostu zagłosuj. - person AMIC MING; 29.11.2019
comment
Działa również dobrze z zakresami portów, takimi jak lsof -ti:8080-8089 | xargs kill. - person dvlsg; 06.03.2020

Najpierw musisz uruchomić (zamień numer portu):

fuser -k 3000/tcp

Spowoduje to zwolnienie portu. Po uruchomieniu powyższego polecenia uruchom:

service docker restart

I Twój problem został rozwiązany.

person Anshuman Bardhan    schedule 21.07.2020
comment
NAJLEPSZA ODPOWIEDŹ TUTAJ! - person Michael Paccione; 27.01.2021
comment
dobra odpowiedź, dzięki, u mnie też działa - person perymerdeka; 01.03.2021

spróbuj tak,

 sudo fuser -n tcp -k 8080
person Adil Abbasi    schedule 26.06.2015

Wybierz numer portu i zastosuj grep w poleceniu netstat, jak pokazano poniżej

netstat -ap | grep :7070

Wyjście konsoli

tcp 0 0 :::7070 :::* SŁUCHAJ 3332/java

Zakończ usługę na podstawie PID (numer identyfikacyjny procesu)

kill -9 3332
person Lova Chittumuri    schedule 06.08.2019

  1. lsof -i tcp:8000 To polecenie wyświetla informacje o procesie działającym na porcie 8000

  2. kill -9 [PID] To polecenie kończy proces

person Nandhitha Ramaraj    schedule 16.12.2015
comment
Właśnie zauważyłem, że przez przypadek odrzuciłem to kilka tygodni temu. Jeśli nieznacznie zmienisz swoją odpowiedź, powinienem móc ją usunąć - person Robin-Hoodie; 11.01.2018

Linux: możesz użyć tego polecenia, jeśli znasz port:

netstat -plten | grep LISTEN | grep 8080

AIX:

netstat -Aan | grep LISTEN | grep 8080

Następnie bierzesz pierwszą kolumnę (przykład: f100050000b05bb8) i uruchamiasz następującą komendę:

rmsock f100050000b05bb8 tcpcb

Zamknij proces.

person ben rhouma moez    schedule 12.08.2014

Linux: Najpierw możesz znaleźć PID tego polecenia, jeśli znasz port:

netstat -tulpn 

przykład:-

 Local Address  Foreign Address  State    PID/Program name

  :::3000       :::*             LISTEN    15986/node 

Następnie podejmujesz proces zabijania. uruchom następujące polecenie:

zabij -9 PID

Przykład: -

zabij -9 15986

person Kundan Kumar    schedule 07.03.2018

Możesz poznać listę wszystkich portów uruchomionych w systemie wraz z ich szczegółami (pid, adres itp.):

netstat -tulpn

Możesz poznać szczegóły konkretnego numeru portu, podając numer portu w następującym poleceniu:

sudo netstat -lutnp | grep -w '{port_number}'

np.: sudo netstat -lutnp | grep -w '8080' Szczegóły zostaną podane w następujący sposób:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name

jeśli chcesz zabić proces za pomocą pid, to : kill -9 {PID}

jeśli chcesz zabić proces przy użyciu numeru portu: fuser -n tcp {port_number}

użyj sudo, jeśli nie możesz uzyskać dostępu do żadnego.

person YAP    schedule 14.03.2019

Uruchom następujące polecenie, aby znaleźć PID numeru portu 8080:

sudo lsof -t -i:8080

Możesz teraz łatwo zabić swój PID za pomocą następującego polecenia:

sudo zabij -9

Możesz użyć jednego polecenia, aby zabić proces na określonym porcie, używając następującego polecenia:

sudo kill -9 $(sudo lsof -t -i:8000)

person RajuS    schedule 17.06.2020

kill -9 `fuser 8080/tcp|xargs -n 1`, to polecenie kończy także proces nasłuchujący na porcie 8080 z połączeniem TCP

person Harshit Garg    schedule 22.05.2017

Po prostu uruchom to polecenie. Nie zapomnij zastąpić portnumber swoim portem ;)

  kill -9 $(sudo lsof -t -i:portnumber)
person monica    schedule 13.06.2020
comment
Przez większość czasu nie ma potrzeby Sudo na komputerze Mac. - person Aditya Parmar; 14.07.2020

sudo apt-get install psmisc (or sudo yum install psmisc)
sudo fuser 80/tcp

Wynik: 80/tcp: 1858 1867 1868 1869 1871

Zabijaj procesy jeden po drugim

zabić -9 1858

person Fadid    schedule 04.06.2018

Oto rozwiązanie dla systemu Windows:

C:\Users\Niroshan>netstat -ano|findstr "PID :8080"

Proto Local Address Foreign Address State PID
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 18264

taskkill /pid 18264 /f
person Niroshan Ratnayake    schedule 14.07.2020
comment
Pytanie dotyczy Linuksa. - person Robert; 14.07.2020

Pracuję na systemie Yocto Linux, który ma ograniczony zestaw dostępnych narzędzi Linux. Chciałem zabić proces korzystający z określonego portu (1883).

Najpierw, aby zobaczyć, jakich portów słuchamy, użyłem następującego polecenia:

root@root:~# netstat -lt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       
tcp        0      0 0.0.0.0:hostmon         0.0.0.0:*               LISTEN      
tcp        0      0 localhost.localdomain:domain 0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:9080            0.0.0.0:*               LISTEN      
tcp        0      0 0.0.0.0:1883            0.0.0.0:*               LISTEN      
tcp        0      0 :::hostmon              :::*                    LISTEN      
tcp        0      0 localhost:domain        :::*                    LISTEN      
tcp        0      0 :::ssh                  :::*                    LISTEN      
tcp        0      0 :::1883                 :::*                    LISTEN      

Następnie znalazłem nazwę procesu przy użyciu portu 1883 w następujący sposób:

root@root:~# fuser 1883/tcp
290 
root@root:~# ps | grep 290
  290 mosquitt 25508 S    /usr/sbin/mosquitto -c /etc/mosquitto/mosquitto.conf
12141 root      8444 S    grep 290

Jak widać powyżej, to program /usr/sbin/mosquitto używa portu 1883.

Na koniec zabiłem proces:

root@root:~# systemctl stop mosquitto

Użyłem systemctl, ponieważ w tym przypadku była to usługa systemowa.

person Daniel Jonsson    schedule 05.05.2020

  1. najpierw sprawdź proces netstat -lt
  2. sprawdź identyfikator procesu fuser <port number>/tcp
  3. zabij proces działający na porcie kill <process id>
person Gunjan Paul    schedule 24.05.2020

Spowoduje to zabicie programów działających na porcie 80

sudo fuser -k 80/tcp
person Asad Ullah    schedule 17.06.2021

Inny sposób z Git Bash:

stopProcessByPortNumber() {
port=":${1}"
portStrLine="$(netstat -ano | findstr LISTENING | findstr $port)"
processId="$(grep -oP '(\d+)(?!.*\d)' <<< $portStrLine)"
echo $processId
taskkill -PID $processId -F
}
person Lucas Moyano Angelini    schedule 09.02.2019

W moim przypadku cent os ma jakiś problem z sugerowaną odpowiedzią. Zastosowałem więc następujące rozwiązanie:

  ss -tanp | grep 65432 | head -1 | grep -Po "(?<=pid=).*(?=,)" | xargs kill
person Kamesh Jungi    schedule 10.02.2020

opierać się na tym, co powiedział @veer7:

jeśli chcesz wiedzieć, co było w porcie, zrób to, zanim go zabijesz.

$ sudo netstat -plten |grep java
tcp6       0      0 127.0.0.1:8005          :::*                    LISTEN      1000       906726      25296/java      
tcp6       0      0 :::8009                 :::*                    LISTEN      1000       907503      25296/java      
tcp6       0      0 :::8080                 :::*                    LISTEN      1000       907499      25296/java      
$ ps 25296
  PID TTY      STAT   TIME COMMAND
25296 ?        Sl     0:16 /usr/lib/jvm/java-8-openjdk-amd64/bin/java -Dcatalina.base=/hom

Użyj „ps” i numeru procesu, który zgłosił Netstat

person JesseBoyd    schedule 12.10.2017

Jak zakończyć proces, jeśli usługa na porcie nie odpowiada

timeout 1 telnet localhost 8080 2>&1 | if grep -q 'Unable'; then sudo kill -9 $(sudo lsof -t -i:8080); fi

Co to robi

  1. Rozpocznij „limit czasu” z jedną sekundą, aby zakończyć działanie Telnetu
  2. ' 2›&1 | ' komunikat o błędzie potoku bez wychodzenia
  3. Jeśli komunikat o błędzie zawiera „Nie można”, uruchom kod, aby zakończyć blokowanie procesu na porcie 8080

Można to umieścić w pliku i uruchamiać regularnie z „Sudo crontab”

person Punnerud    schedule 31.08.2020

W systemie Windows będzie to netstat -ano | grep "8080" i otrzymamy następujący komunikat TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 10076

Możemy zabić PID za pomocą taskkill /F /PID 10076

person Chaklader    schedule 28.09.2016
comment
Pytanie wyraźnie dotyczy prośby o pomoc dla Linuksa; nie Windowsa. - person babycakes; 30.12.2016