Як знайти та звільнити заблокований порт у Linux?

Як знайти та звільнити заблокований порт у Linux? – ITEDU Blog

Типова ситуація під час розгортання сервісу чи перезапуску вебсервера: замість успішного старту у терміналі з’являється помилка Address already in use.

Це означає, що потрібний мережевий порт уже використовує інший процес. У такій ситуації не потрібно перезавантажувати весь сервер, адже це зупинить суміжні служби та створить зайвий простій. Набагато ефективніше знайти процес, який утримує порт, і коректно його завершити.

Розберемо основний алгоритм дій для вирішення цієї проблеми.

Послідовність дій під час блокування порту

Щоб безпечно звільнити порт, завжди дотримуйтеся двох кроків:

  1. Ідентифікація: з’ясуйте назву програми, користувача та PID (ідентифікатор процесу), який займає порт.
  2. Завершення: оцініть ризики зупинки цієї програми та виконайте відповідну команду.

Перевірка перед зупинкою обов’язкова. Якщо завершити процес просто так, є ризик зупинити критичну базу даних або системну службу, яка працює на цьому ж порту.

Крок 1. Перевірка процесу за номером порту

Залежно від наявних у системі утиліт, для діагностики використовують lsof або ss. Для прикладу перевіримо порт 8080.

Використання утиліти lsof

Утиліта lsof (List Open Files) показує всі відкриті файли та мережеві сокети в системі.

Для перевірки виконайте команду:

sudo lsof -i :8080

Команду необхідно запускати з привілеями sudo. Без прав суперкористувача система виведе лише ваші власні процеси та не покаже сервіси, запущені від імені інших юзерів або root.

Приклад виводу термінала:

COMMAND   PID     USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
node     3821    alex   22u  IPv6  54312      0t0  TCP *:8080 (LISTEN)

Ключові параметри у відповіді:

  • COMMAND (node) — назва програми або середовища виконання.
  • PID (3821) — унікальний ідентифікатор процесу, необхідний для його зупинки.
  • LISTEN — статус сокета, який вказує на те, що процес очікує на вхідні з’єднання.

Використання утиліти ss

Якщо у вашій системі відсутня lsof, скористайтеся інструментом ss (Socket Statistics). Він входить до стандартного пакета iproute2 і присутній практично в кожному дистрибутиві Linux.

Виконайте команду:

sudo ss -tulnp | grep :8080

Розшифровка прапорів:

  • -t та -u — перевірка TCP та UDP сокетів;
  • -l — фільтрація сокетів у стані очікування (LISTEN);
  • -n — вивід цифрових номерів портів замість їхніх системних назв;
  • -p — вивід назви програми та її PID.

Приклад виводу:

tcp   LISTEN 0  128   0.0.0.0:8080   0.0.0.0:*   users:(("node",pid=3821,fd=22))

У цьому рядку також вказано PID: 3821.

Крок 2. Завершення процесу за допомогою kill

Після отримання PID виконайте зупинку процесу. Завжди починайте з м’якої зупинки, і лише за відсутності реакції застосовуйте примусову.

Штатне завершення (SIGTERM)

Команда kill надсилає сигнал SIGTERM (сигнал 15). Це командує програмі зберегти поточний стан, закрити файлові дескриптори та мережеві з’єднання і штатно завершити роботу.

kill 3821

Якщо команда виконалася без повідомлень про помилки, процес зупинено. Перевірте це повторно через sudo lsof -i :8080.

Примусове завершення (SIGKILL)

Якщо процес не реагує на звичайну команду kill або завис, використайте прапор -9 (SIGKILL):

kill -9 3821

Сигнал -9 обробляється ядром Linux напряму. Процес знищується миттєво без можливості зберегти дані чи закрити транзакції. Застосовуйте kill -9 тільки у випадках, коли процес не зупиняється штатно.

Альтернативні варіанти зупинки в одну команду

Якщо ви працюєте в тестовому середовищі й вам не потрібно вручну копіювати PID, можна скористатися автоматизованими командами.

Спосіб 1. Використання fuser

Утиліта fuser знаходить і завершує процеси безпосередньо за номером порту:

sudo fuser -k 8080/tcp

Прапор -k надсилає сигнал SIGTERM. Для примусової зупинки додайте прапор -9:

sudo fuser -k -9 8080/tcp

Якщо команда відсутня в системі, встановіть пакет psmisc (sudo apt install psmisc або sudo dnf install psmisc).

Спосіб 2. Комбінація lsof та kill

Також можна передати вивід lsof безпосередньо в команду kill через підстановку:

sudo kill -9 $(sudo lsof -t -i :8080)

Прапор -t залишає у виводі lsof тільки номер PID, який одразу підставляється в аргументи kill.

На завершення

От і все. Блокування портів — це типова робоча ситуація, яка зазвичай вирішується за кілька секунд і не потребує радикальних заходів на кшталт перезавантаження сервера. Головне — дотримуватися послідовного підходу:

  • Не перезавантажуйте сервер без нагальної потреби.
  • Визначте PID процесу через sudo lsof -i :8080 або sudo ss -tulnp | grep :8080.
  • Переконайтеся за назвою програми, що зупинка безпечна для системи.
  • Завершіть процес через kill <PID>, за потреби застосуйте kill -9 <PID> або sudo fuser -k 8080/tcp.

Залишити відповідь

Дякуємо, що поділились