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?
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?
Odpowiedzi:
Znajdź identyfikator procesu (PID), który zajmuje numer portu (np. 5955), który chcesz zwolnić
sudo lsof -i :5955
Zabij proces, który obecnie używa portu, używając jego PID
sudo kill -9 PID
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:
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. ifconfig
Polecenie wyświetla wszystkie adresy IPv4 i IPv6 komputera .
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
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
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.
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 porcie 3000
.
lsof
w połączeniu z kill
nic nie zwrócił i spowodował, że mój skrypt zawiesił się na macOS Sierra. Ale killport
działa jak urok i jest szybszy. Dzięki!
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.
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
Najpierw sprawdź identyfikator Procees (pid), który zajął wymagany port. (Np. 5434)
ps aux | grep 5434
2. zabij ten proces
kill -9 <pid>