Как узнать, какой процесс занимает порт в Linux, и завершить его работу

При работе с Linux иногда возникает ситуация, когда приложение не запускается, сервер отказывается принимать подключения или веб-служба сообщает, что нужный порт уже используется. Чаще всего причина заключается в том, что другой процесс уже занял этот сетевой порт. Например, веб-сервер не может запуститься на порту 80, если его использует другая программа. Чтобы устранить проблему, необходимо определить приложение, которое занимает порт, узнать его идентификатор PID и при необходимости завершить работу процесса.

В Linux существует несколько удобных инструментов для диагностики сетевых подключений. С их помощью можно быстро обнаружить конфликтующий процесс, получить дополнительную информацию о нём и освободить необходимый порт без перезагрузки операционной системы.

Как проверить занятый порт с помощью команды ss

Один из наиболее удобных современных инструментов для просмотра сетевых соединений в Linux — команда ss. Она входит в состав пакета iproute2, который присутствует практически во всех популярных дистрибутивах, включая Ubuntu, Debian, Fedora и Arch Linux.

Чтобы посмотреть все TCP-порты, которые находятся в состоянии прослушивания, выполните команду:

sudo ss -tulpn

Здесь используются следующие параметры: -t отображает TCP-соединения, -u — UDP, -l показывает прослушиваемые сокеты, -p выводит информацию о процессах, а -n отключает преобразование адресов и номеров портов в названия служб.

Если требуется проверить конкретный порт, например 8080, используйте фильтрацию:

sudo ss -tulpn | grep ':8080'

В результате можно увидеть строку с номером порта, протоколом, состоянием соединения и информацией о программе. Например, запись users:(("nginx",pid=1520,fd=6)) означает, что порт использует процесс nginx с идентификатором PID 1520.

Поиск процесса через lsof

Ещё один популярный инструмент — lsof (List Open Files). В Linux сетевые сокеты представлены как открытые файловые дескрипторы, поэтому программа позволяет определить, какое приложение использует конкретный порт.

Для поиска процесса, занимающего TCP-порт 8080, выполните:

sudo lsof -i :8080

Если необходимо проверить только TCP-подключения, команда будет выглядеть следующим образом:

sudo lsof -i TCP:8080

В таблице результатов особенно важны столбцы COMMAND, PID и USER. Первый показывает название программы, второй — идентификатор процесса, третий — пользователя, от имени которого она запущена. Например, если PID равен 1520, именно этот номер потребуется для последующего завершения процесса.

В некоторых дистрибутивах lsof не установлен по умолчанию. В Ubuntu и Debian его можно добавить командой:

sudo apt install lsof

Использование команды fuser

Для быстрого определения владельца порта подходит утилита fuser. Она позволяет не только обнаруживать процессы, но и при необходимости отправлять им сигналы завершения.

Чтобы узнать, кто использует порт 8080, выполните:

sudo fuser -v 8080/tcp

Команда выведет PID найденных процессов и дополнительную информацию о них. Параметр -v включает подробный режим отображения. Для UDP-порта вместо tcp указывается udp.

Как правильно завершить процесс и освободить порт

После обнаружения процесса можно завершить его работу с помощью команды kill. Допустим, приложение занимает порт 8080, а его PID равен 1520. Для отправки стандартного сигнала завершения SIGTERM используйте:

sudo kill 1520

SIGTERM позволяет программе корректно завершиться: сохранить данные, закрыть файлы и освободить сетевые соединения. Это предпочтительный вариант, поскольку приложение получает возможность выполнить необходимые действия перед остановкой.

Если процесс не реагирует на SIGTERM, можно применить принудительное завершение:

sudo kill -9 1520

Сигнал SIGKILL немедленно прекращает выполнение процесса. Программа не может перехватить его или выполнить обработчик завершения, поэтому использовать этот способ следует только в крайнем случае.

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

sudo fuser -k 8080/tcp

Эта команда отправляет сигнал завершения процессам, использующим указанный TCP-порт. Перед её применением желательно проверить, какие именно программы будут остановлены.

Как убедиться, что порт освободился

После завершения процесса рекомендуется повторно проверить состояние порта. Для этого выполните:

sudo ss -tulpn | grep ':8080'

Если команда ничего не выводит, прослушиваемый сокет на указанном порту не обнаружен. Теперь можно повторно запустить нужное приложение. Если порт снова оказывается занятым, возможно, остановленная служба автоматически перезапускается системой.

В таком случае следует проверить состояние службы через systemd:

sudo systemctl status nginx

Если порт занимает именно nginx и требуется остановить службу, используйте:

sudo systemctl stop nginx

Полезные команды для работы с портами в Linux

Для повседневной диагностики достаточно запомнить несколько основных команд:

Команда Назначение
sudo ss -tulpn Просмотр занятых портов и процессов
sudo lsof -i :8080 Поиск программы, использующей порт
sudo fuser -v 8080/tcp Определение PID процесса
sudo kill 1520 Корректное завершение процесса
sudo kill -9 1520 Принудительное завершение процесса
sudo systemctl stop nginx Остановка службы nginx

Заключение

Определить, какой процесс занимает порт в Linux, можно несколькими способами. Для большинства задач оптимально использовать ss, поскольку эта утилита быстро показывает сетевые сокеты и связанные с ними процессы. Команды lsof и fuser станут полезными дополнительными инструментами, когда требуется более детальная информация или быстрое освобождение порта.

При завершении процессов лучше начинать с обычного kill, оставляя принудительный SIGKILL для ситуаций, когда приложение перестало отвечать. Если программа управляется systemd, правильнее останавливать соответствующую службу через systemctl. Такой подход позволяет безопасно устранять конфликты портов и поддерживать стабильную работу Linux-системы.

Понравилась статья? Поделиться с друзьями: