Tutaj zadajesz złe pytanie. Nie jest możliwe po prostu „zamknąć port” spoza aplikacji, która otworzyła gniazdo nasłuchując na nim. Jedynym sposobem na to jest całkowite zabicie procesu, który jest właścicielem portu. Następnie, za minutę lub dwie, port będzie ponownie dostępny do użytku. Oto, co się dzieje (jeśli nie obchodzi cię to, przejdź do końca, gdzie pokażę ci, jak zabić proces będący właścicielem konkretnego portu):
Porty to zasoby przydzielane przez system operacyjny różnym procesom. Jest to podobne do pytania systemu operacyjnego o wskaźnik pliku. Jednak w przeciwieństwie do wskaźników plików, tylko JEDEN proces na raz może posiadać port. Dzięki interfejsowi gniazda BSD procesy mogą żądać nasłuchu na porcie, który system operacyjny następnie udzieli. System operacyjny upewni się również, że żaden inny proces nie uzyska tego samego portu. W dowolnym momencie proces może zwolnić port, zamykając gniazdo. System operacyjny odzyska port. Alternatywnie, jeśli proces zakończy się bez zwolnienia portu, system operacyjny ostatecznie odzyska port (choć nie nastąpi to natychmiast: zajmie to kilka minut).
Teraz, co chcesz zrobić (po prostu zamknij port z linii poleceń), nie jest możliwe z dwóch powodów. Po pierwsze, gdyby było to możliwe, oznaczałoby to, że jeden proces mógłby po prostu wykraść zasób innego procesu (port). Byłaby to zła polityka, chyba że byłaby ograniczona do procesów uprzywilejowanych. Drugim powodem jest to, że nie jest jasne, co stanie się z procesem, który był właścicielem portu, jeśli pozwolimy mu kontynuować działanie. Kod procesu jest napisany przy założeniu, że jest właścicielem tego zasobu. Gdybyśmy go po prostu usunęli, skończyłoby się to na jego własnym zawieszeniu, więc OS nie pozwala ci tego zrobić, nawet jeśli jesteś uprzywilejowanym procesem. Zamiast tego musisz je po prostu zabić.
W każdym razie, jak zabić proces, który jest właścicielem konkretnego portu:
sudo netstat -ap | grep :<port_number>
Spowoduje to wyświetlenie linii odpowiadającej portowi wstrzymania procesu, na przykład:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
W tym przypadku, procHoldingPort to nazwa procesu, który otworzył port, 4683 jest jego pid i 8000 (zauważ, że jest to TCP) to numer portu, który przechowuje.
Następnie spójrz na ostatnią kolumnę, zobaczysz /. Następnie wykonaj to:
kill <pid>
Jeśli to nie zadziała (możesz sprawdzić, uruchamiając ponownie polecenie netstat). Zrób to:
kill -9 <pid>
Ogólnie lepiej jest unikać wysyłania SIGKILL, jeśli możesz. Dlatego mówię ci, żebyś spróbował kill
przed kill -9
. Po prostu używam kill
wysyła łagodniejszego SIGTERM.
Jak już powiedziałem, ponowne otwarcie portu zajmie kilka minut, jeśli to zrobisz. Nie wiem, jak to przyspieszyć. Jeśli ktoś inny, chciałbym to usłyszeć.