Jak zamknąć otwarty port z terminala na komputerze Mac?


198

Otworzyłem port nr 5955 z klasy Java w celu komunikacji z klientem. Jak zamknąć ten port po zakończeniu? a także które polecenie może mi pokazać, jeśli port jest otwarty lub zamknięty?


1
Jak otworzyłeś ten port? Nie jest jasne, czy mówisz o otwieraniu i zamykaniu portów w aplikacji Java czy z zapory.
mariosangiorgio

Odpowiedzi:


396
  1. Znajdź identyfikator procesu (PID), który zajmuje numer portu (np. 5955), który chcesz zwolnić

    sudo lsof -i :5955
    
  2. Zabij proces, który obecnie używa portu, używając jego PID

    sudo kill -9 PID
    

32
Wysłanie -9 nie powinno być pierwszą próbą zabicia procesu i jest to bardzo zły nawyk. Jak pamiętam, najpierw powinieneś użyć kill PID(co oznacza -15), a następnie wypróbować -2 i -1. -9 jest ostatecznością tylko wtedy, gdy wszystkie inne opcje nie zadziałały.
Miau

3
zabił pID bez żadnych flag, jak sugeruje @Meow, i to zadziałało dla mnie
Toni Leigh

39

Aby znaleźć proces, spróbuj:

sudo lsof -i :portNumber

Zabij proces, który obecnie używa portu, używając jego PID

kill PID

a następnie sprawdź, czy port został zamknięty. Jeśli nie, spróbuj:

kill -9 PID

Zrobiłbym następujące, jeśli poprzednie nie zadziałało

sudo kill -9 PID

Żeby być bezpiecznym. Ponownie, w zależności od sposobu otwarcia portu, może to nie mieć znaczenia.


26

Jakkolwiek otworzysz port, zamkniesz go w ten sam sposób. Na przykład, jeśli utworzyłeś gniazdo, powiązałeś je z portem 0.0.0.0:5955 i nazwałeś nasłuchuj, zamknij to samo gniazdo.

Możesz także po prostu zabić proces, w którym port jest otwarty.

Jeśli chcesz dowiedzieć się, jaki proces ma otwarty port, spróbuj tego:

lsof -i :5955

Jeśli chcesz wiedzieć, czy port jest otwarty, możesz wykonać to samo polecenie lsof (jeśli jakikolwiek proces ma go otwarty, jest otwarty; w przeciwnym razie nie jest), lub możesz po prostu spróbować się z nim połączyć, np .:

nc localhost 5955

Jeśli natychmiast powróci bez wyjścia, port nie jest otwarty.

Warto wspomnieć, że technicznie rzecz biorąc, nie jest to otwarty port, ale połączenie host: port. Na przykład, jeśli jesteś podłączony do sieci LAN jako 10.0.1.2, możesz powiązać gniazdo z 127.0.0.1:5955 lub 10.0.1.2:5955, bez wpływu na jedno z nich, lub możesz połączyć się z 0.0.0.0 : 5955 do obsługi obu jednocześnie. ifconfigPolecenie wyświetla wszystkie adresy IPv4 i IPv6 komputera .


24

bardzo proste znajdź port 5900:

sudo lsof -i :5900

następnie biorąc pod uwagę 59553 jako PID

sudo kill 59553

1
To nic nie dodaje do istniejących odpowiedzi!
hatef

16

W 2018 r. Oto, co działało dla mnie za pomocą MacOS HighSierra:

sudo lsof -nPi: yourPortNumber

następnie:

sudo zabij -9 twójPIDnumber


1
lsof -nPijest nieco lepszy, ponieważ numer portu jest rzeczywiście widoczny na wyjściu i masz lepsze poczucie tego, co zabijasz.
Rich Stone

1
Pomocny jest również widok informacji o wszystkich portach nasłuchujących:sudo lsof -nPi | grep LISTEN
leanne

14

Jedna wkładka jest najlepsza

kill -9 $(lsof -i:PORT -t) 2> /dev/null

Przykład: na komputerze Mac chciałem wyczyścić port 9604. Następujące polecenie działało jak urok

 kill -9 $(lsof -i:9604 -t) 2> /dev/null 

6

Możesz także użyć tego pierwszego polecenia, aby zabić proces, który jest właścicielem określonego portu:

sudo netstat -ap | grep :<port_number>

Załóżmy na przykład, że ten proces przechowuje port 8000 TCP, a następnie uruchamia polecenie:

sudo netstat -ap | grep :8000

wyświetli linię odpowiadającą procesowi obsługującemu port 8000 , na przykład:

tcp  0  0 *:8000   *:* LISTEN  4683/procHoldingPort

W tym przypadku procHoldingPort to nazwa procesu, który otworzył port, 4683 to jego pid, a 8000 (zwróć uwagę, że jest to TCP) to numer portu, który posiada (który chcesz zamknąć).

Następnie zakończ proces zgodnie z powyższym przykładem:

kill  4683

Jak wspomnieli inni, jeśli to nie zadziała (możesz spróbować użyć kill z -9 jako argumentu):

kill -9 4683

Ponownie, ogólnie lepiej jest unikać wysyłania SIGKILL (-9), jeśli możesz.

Twoje zdrowie,

Chłopak.


5

Używam w lsofpołączeniu zkill , jak wspomniano powyżej; ale napisałem krótki skrypt bash, aby zautomatyzować ten proces.

Za pomocą tego skryptu możesz po prostu pisać killport 3000z dowolnego miejsca, a on zabije wszystkie procesy uruchomione na porcie 3000.

https://github.com/xtrasimplicity/killport


1
Uratowałeś mi dzień. Z jakiegoś powodu lsofw połączeniu z killnic nie zwrócił i spowodował, że mój skrypt zawiesił się na macOS Sierra. Ale killportdziała jak urok i jest szybszy. Dzięki!
wout

4

W tym celu utworzyłem funkcję.

function free_port() {
    if [ -z $1 ] 
    then
        echo no Port given
    else
        PORT=$1;
        PID=$(sudo lsof -i :$PORT) # store the PID, that is using this port 

        if [ -z $PID ] 
        then
            echo port: $PORT is already free.
        else
            sudo kill -9 $PID # kill the process, which frees the port
            echo port: $PORT is now free.
        fi
    fi
}

free_port 80 # you need to change this port number

Skopiuj i wklej ten blok kodu w swoim terminalu powinien zwolnić żądany port. Pamiętaj tylko, aby zmienić numer portu w ostatniej linii.


3

spróbuj poniżej, zakładając, że działającym portem jest 8000:

free-port() { kill "$(lsof -t -i :8000)"; }

Tutaj znalazłem odniesienie


1

Gdy program, który otworzył port, zostanie zamknięty, port zostanie automatycznie zamknięty. Jeśli zabijesz proces Java działający na tym serwerze, powinno to zrobić.


-1
  1. Najpierw sprawdź identyfikator Procees (pid), który zajął wymagany port. (Np. 5434)

    ps aux | grep 5434

2. zabij ten proces

   kill -9 <pid>
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.