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?
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.
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 .
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.
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.
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ć.
Odpowiedzi:
Znajdź identyfikator procesu (PID), który zajmuje numer portu (np. 5955), który chcesz zwolnić
Zabij proces, który obecnie używa portu, używając jego PID
źródło
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.Aby znaleźć proces, spróbuj:
Zabij proces, który obecnie używa portu, używając jego PID
a następnie sprawdź, czy port został zamknięty. Jeśli nie, spróbuj:
Zrobiłbym następujące, jeśli poprzednie nie zadziałało
Żeby być bezpiecznym. Ponownie, w zależności od sposobu otwarcia portu, może to nie mieć znaczenia.
źródło
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:
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 .:
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.
ifconfig
Polecenie wyświetla wszystkie adresy IPv4 i IPv6 komputera .źródło
bardzo proste znajdź port 5900:
następnie biorąc pod uwagę 59553 jako PID
źródło
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
źródło
lsof -nPi
jest nieco lepszy, ponieważ numer portu jest rzeczywiście widoczny na wyjściu i masz lepsze poczucie tego, co zabijasz.sudo lsof -nPi | grep LISTEN
Jedna wkładka jest najlepsza
Przykład: na komputerze Mac chciałem wyczyścić port 9604. Następujące polecenie działało jak urok
źródło
Możesz także użyć tego pierwszego polecenia, aby zabić proces, który jest właścicielem określonego portu:
Załóżmy na przykład, że ten proces przechowuje port 8000 TCP, a następnie uruchamia polecenie:
wyświetli linię odpowiadającą procesowi obsługującemu port 8000 , na przykład:
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:
Jak wspomnieli inni, jeśli to nie zadziała (możesz spróbować użyć kill z -9 jako argumentu):
Ponownie, ogólnie lepiej jest unikać wysyłania SIGKILL (-9), jeśli możesz.
Twoje zdrowie,
Chłopak.
źródło
Używam w
lsof
połą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 3000
z dowolnego miejsca, a on zabije wszystkie procesy uruchomione na porcie3000
.https://github.com/xtrasimplicity/killport
źródło
lsof
w połączeniu zkill
nic nie zwrócił i spowodował, że mój skrypt zawiesił się na macOS Sierra. Alekillport
działa jak urok i jest szybszy. Dzięki!W tym celu utworzyłem funkcję.
Skopiuj i wklej ten blok kodu w swoim terminalu powinien zwolnić żądany port. Pamiętaj tylko, aby zmienić numer portu w ostatniej linii.
źródło
spróbuj poniżej, zakładając, że działającym portem jest
8000
:Tutaj znalazłem odniesienie
źródło
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ć.
źródło
Najpierw sprawdź identyfikator Procees (pid), który zajął wymagany port. (Np. 5434)
ps aux | grep 5434
2. zabij ten proces
źródło