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


759

Próbowałem zamknąć tomcat za pomocą katalogu ./shutdown.shtomcat /bin. Ale stwierdził, że serwer nie został poprawnie zamknięty. W związku z tym nie udało mi się ponownie uruchomić
Mój tomcat działa na porcie 8080.

Chcę zabić uruchomiony proces tomcat 8080. Najpierw chcę mieć listę procesów uruchomionych na określonym porcie (8080), aby wybrać proces do zabicia.


Odpowiedzi:


934

Spowoduje fuser 8080/tcpto wydrukowanie PID procesu związanego z tym portem.

A to fuser -k 8080/tcpzabije ten proces.

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


2
czy to również zamyka ewentualne podłączone gniazdo do 8080?
fer y

9
Nie zamyka prawidłowo portu. Port zostaje przełączony w stan TIME_WAIT po zabiciu procesu nadrzędnego. System operacyjny w końcu całkowicie zamknie port po około 60 sekundach. Oznacza to, że nie można ponownie użyć portu przez co najmniej 60 sekund (chyba że podasz opcję ponownego użycia dla gniazda).
Mark Lakata,

2
Na Darwin musi być używana inna wersja fuser. Pobiera tylko plik, nie obsługuje -k.
ap

3
„fuser -k -n tcp 8080” również zabije ten proces
Hesham Yassin

7
@dbliss fuser jest częścią psmisc. Jeśli tak fuser: command not found, zainstaluj psmisc. W przypadku CentOS / RHEL 7 uruchomsudo yum install psmisc
Tom

699

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)

( -9odpowiada SIGKILL - terminate immediately/hard killsygnałowi: patrz Lista sygnałów zabicia i Do czego służy opcja -9 w poleceniu kill?) Jeśli nie podano żadnego sygnału kill, wysyłany jest sygnał TERM aka -15lub soft killwysyłany, co czasami nie wystarcza do zabicia proces.).


9
kill: wykorzystanie: kill [-s sigspec | -n signum | -sigspec] pid | jobspec ... lub kill -l [sigspec] Właśnie to otrzymuję, kiedy
wykonuję

2
@SudhirBelagali zrobiłeś to z superużytkownikiemsudo
Marcelem Djamanem

5
Pracowałem również na moim Macu
asherbar

2
Chciałbym dodać, że czasami nie masz uprawnień, aby zobaczyć identyfikator procesu, w takim przypadku musisz to zrobić sudo lsof -i:8080.
Akavall,

1
dlaczego drugie wskazówki są bardziej gwałtowne?
Webwoman

281

Użyj polecenia

 sudo netstat -plten |grep java

używane grep javajako tomcatzastosowania javajako ich procesy.

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

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

poprzednia liczba /javato identyfikator procesu. Teraz użyj killpolecenia, aby zabić proces

kill -9 16085

-9 oznacza, że ​​proces zostanie zabity siłą.


11
Możesz dodać, że możesz potrzebować uprawnień roota, aby uzyskać nazwy procesów netstat.
Jonas Schäfer

2
@JonasWielicki możesz zobaczyć te, które posiadasz bez uprawnień roota.
dbliss,

Potrzebowałem uprawnień roota dla netstat. Czy istnieje sposób, aby dowiedzieć się, skąd pochodzi ten proces? O ile mogłem powiedzieć, zamknąłem wszystkie aplikacje, ale mogło to być z okna terminala, w którym przypadkowo przesunąłem procesy do zadania w tle. Może powinienem był uruchomić polecenie terminalu „ps”, aby najpierw zobaczyć wszystkie procesy ...
JesseBoyd,

150

Dodałbym tę linijkę, aby zabić tylko LISTEN na określonym porcie:

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


9
Myślę, że to powinna być najlepsza odpowiedź. Dzięki @Gal Bracha
Sam Kah Chiin

2
To najlepsze rozwiązanie, ponieważ nie zabija również mojej przeglądarki!
Russo,

Najlepsza odpowiedź! Prosty, zwięzły i działa poprawnie.
Car Bomba

116

Możesz użyć polecenia lsof. Niech numer portu 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, używając go (identyfikator procesu to 75782)…

kill -9 75782

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


1
aby skutecznie zabić proces, będziesz musiał użyć -9 jak kill -9 75782; ponieważ czasami niewiele procesów nie
kończy się za

73

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

sudo lsof -t -i:8080

Tutaj,

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

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

sudo kill -9 <PID>

Tutaj,

  • kill - polecenie zabicia procesu
  • -9 - siłą

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

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

Aby uzyskać więcej informacji, zobacz poniższy link Jak zabić proces na określonym porcie w systemie Linux


dzięki stary. sudo kill -9 $(sudo lsof -t -i:8080)pracował dla mnie
Junaid


41

Wypisuje to na standardowe identyfikatory procesów wszystkich uruchomionych na <port_number>:

fuser -n tcp <port_number> 

Drukuje również niektóre rzeczy do stderr, więc:

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

Następnie możemy podać te identyfikatory procesów do killpolecenia:

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

Możesz również włączyć tę funkcję, jeśli często to robisz:

function killport() {
    sudo kill $(fuser -n tcp $1 2> /dev/null)
}

35

Zdobądź PID zadania i zabij go.

lsof -ti:8080 | xargs kill

Dziękuję za odpowiedź. Bardzo płynnie działa w systemie Mac OS. Jesteście najlepsi. Po prostu głosuj.
AMIC MING

1
Działa również z zakresami portów, takich jak lsof -ti:8080-8089 | xargs kill.
dvlsg,

34

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

netstat -tulnap | grep :*port_num*

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

na przykład

netstat -ap | grep :8080

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

Teraz:

kill -9 1880

Pamiętaj, aby uruchomić wszystkie polecenia jako root


27

Jedna wkładka

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

wyjaśnienie tutaj: użyj kombinacji lsof and 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


16

Wybierz numer portu i zastosuj polecenie grep in netstat, jak pokazano poniżej

netstat -ap | grep :7070

Wyjście konsoli

tcp 0 0 ::: 7070 ::: * LISTEN 3332 / java

Zabij usługę na podstawie PID (numer identyfikacyjny procesu)

kill -9 3332

13
  1. lsof -i tcp:8000 To polecenie wyświetla informacje o procesie uruchomionym na porcie 8000

  2. kill -9 [PID] To polecenie zabija proces


Właśnie zauważyłem, że kilka tygodni temu zlekceważyłem to przez przypadek, jeśli nieznacznie zmodyfikujesz swoją odpowiedź, powinienem być w stanie ją usunąć
Robin-Hoodie

12

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 podejmij proces zabijania. uruchom następujące polecenie:

zabij -9 PID

Przykład: -

zabij -9 15986


10

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 weź pierwszą kolumnę (przykład: f100050000b05bb8) i uruchom następującą komendę:

rmsock f100050000b05bb8 tcpcb

Zamknij proces.


10

Możesz znać listę wszystkich portów działających w systemie wraz z jej 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, sudojeśli nie możesz uzyskać do nich dostępu.


6

kill -9 `fuser 8080/tcp|xargs -n 1`, to polecenie również zabija proces nasłuchujący na porcie 8080 z połączeniem TCP


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

Wynik: 80 / tcp: 1858 1867 1868 1869 1871

Zabij jeden po drugim

zabij -9 1858


2

W moim przypadku cent os ma problem z sugerowaną odpowiedzią. Więc użyłem następującego rozwiązania:

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

2

Pracuję nad systemem 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ć, których 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, jest to program /usr/sbin/mosquittokorzystający z portu 1883.

Wreszcie zabiłem proces:

root@root:~# systemctl stop mosquitto

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


1

w oparciu o to, 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 Netstat zgłosił


1

Inna droga 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
}

0
  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>

-3

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

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


Pytanie wyraźnie dotyczy pomocy Linuksa; nie Windows.
babycakes
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.