Ви ніби не задаєте тут неправильне запитання. Насправді неможливо просто «закрити порт» поза додатком, який відкрив сокет, слухаючи його. Єдиний спосіб зробити це - повністю знищити процес, яким належить порт. Потім, приблизно через хвилину-дві, порт знову стане доступним для використання. Ось що відбувається (якщо вам все одно, пропустіть до кінця, де я покажу вам, як вбити процес, що володіє певним портом):
Порти - це ресурси, виділені ОС на різні процеси. Це схоже на запит ОС для вказівника на файл. Однак, на відміну від покажчиків файлів, порт може мати власне лише ОДИН процес за один раз. Через інтерфейс сокетів BSD процеси можуть подати запит на прослуховування через порт, який ОС надасть. ОС також переконається, що жоден інший процес не отримує той же порт. У будь-який момент процес може звільнити порт, закривши сокет. Потім ОС поверне порт. Крім того, якщо процес закінчиться, не звільняючи порт, ОС з часом поверне порт (хоча це станеться не відразу: це займе кілька хвилин).
Тепер те, що ви хочете зробити (просто закрити порт з командного рядка), неможливо з двох причин. По-перше, якби це було можливо, це означало б, що один процес може просто вкрасти ресурс іншого процесу (порт). Це було б поганою політикою, якщо не обмежуватись лише пільговими процесами. Друга причина - незрозуміло, що буде з процесом, який володів портом, якщо ми дозволимо йому продовжувати працювати. Код процесу пишеться, припускаючи, що він володіє цим ресурсом. Якщо ми його просто забрали, це в кінцевому підсумку вийде з ладу, тому ОС не дозволяє вам це робити, навіть якщо ви привілейований процес. Натомість ви повинні їх просто вбити.
У будь-якому випадку, ось як вбити процес, який належить певному порту:
sudo netstat -ap | grep :<port_number>
Це виведе рядок, відповідний порту, що тримає процес, наприклад:
tcp 0 0 *:8000 *:* LISTEN 4683/procHoldingPort
У цьому випадку procHoldingPort - це ім'я процесу, який відкрив порт, 4683 - його pid, а 8000 (зауважте, що це TCP) - номер порту, який він містить.
Потім, подивіться в останню колонку, ви побачите /. Потім виконайте це:
kill <pid>
Якщо це не працює (ви можете перевірити, повторно запустивши команду netstat). Зробити це:
kill -9 <pid>
Загалом, краще уникати надсилання SIGKILL, якщо можете. Ось чому я кажу вам спробувати kill
раніше kill -9
. Просто за допомогою kill
відправляє ніжніший SIGTERM.
Як я вже говорив, для порту все одно знадобиться кілька хвилин, якщо ви це зробите. Я не знаю способу прискорити це. Якщо це хтось інший, я хотів би це почути.