Як знайти та звільнити заблокований порт у Linux?
Типова ситуація під час розгортання сервісу чи перезапуску вебсервера: замість успішного старту у терміналі з’являється помилка Address already in use.
Це означає, що потрібний мережевий порт уже використовує інший процес. У такій ситуації не потрібно перезавантажувати весь сервер, адже це зупинить суміжні служби та створить зайвий простій. Набагато ефективніше знайти процес, який утримує порт, і коректно його завершити.
Розберемо основний алгоритм дій для вирішення цієї проблеми.
Послідовність дій під час блокування порту
Щоб безпечно звільнити порт, завжди дотримуйтеся двох кроків:
- Ідентифікація: з’ясуйте назву програми, користувача та PID (ідентифікатор процесу), який займає порт.
- Завершення: оцініть ризики зупинки цієї програми та виконайте відповідну команду.
Перевірка перед зупинкою обов’язкова. Якщо завершити процес просто так, є ризик зупинити критичну базу даних або системну службу, яка працює на цьому ж порту.
Крок 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>або sudofuser -k 8080/tcp.