Как найти процесс по номеру порта в linux

  • Михаил
  • 5 мин. на прочтение
  • 239
  • 27 Jan 2016
  • 27 Jan 2023

При работе в Unix-системах частенько приходится определять, какой процесс занимает порт, например, чтобы остановить его и запустить на нём другой процесс. Поэтому я решил написать эту небольшую статью, чтоб каждый, прочитавший её, мог узнать, каким процессом занят порт в Ubuntu, CentOS или другой ОС из семейства Linux.

Как же вычислить, какие запущенные процессы соотносятся с занятыми портами? Как определить, что за процесс открыл udp-порт 22, tcp-порт 443 и т.п.? Получить подобную информацию мы можем нижеперечисленными методами:

netstatутилита командной строки, показывающая сетевые подключения, таблицы маршрутизации и некоторую статистику сетевых интерфейсов;
fuserутилита командной строки для идентификации процессов с помощью файлов или сокетов;
lsofутилита командной строки, отображающая информацию об используемых процессами файлах и самих процессах в UNIX-системе;
/proc/$pid/в ОС Linux /proc для каждого запущенного процесса содержит директорию (включая процессы ядра) в /proc/$PID с информацией об этом процессе, в том числе и название процесса, открывшего порт.

Использование вышеперечисленных способов может потребовать права супер-пользователя.

Теперь давайте рассмотрим каждый из этих способов по отдельности.

Пример использования netstat

Введём в командную строку команду:

netstat -tulpn

Получим примерно такой результат:

Из вывода видно, что 1540-й порт был открыт ragent с PID’ом 1758. Правильно, это же сервер 1С. Проверить это можно через /proc:

ls -l /proc/1758/exe

Примерный результат выполнения команды:

При необходимости получения информации по конкретному порту (например, 80-му, используемого обычно для HTTP) вместо отображения всей таблицы можно grep-ануть результат:

netstat -tulpn | grep ':80'

Результат будет примерно такой:

 

Пример использования fuser

Если нет приложения, то ставим

yum install psmisc -y

Для того, чтобы вычислить процесс, занимающий порт 22, введём команду:

fuser 22/tcp

И получим результат:

Аналогичным образом, как мы делали выше, можно посмотреть процесс в его директории /proc/$PID, в которой можно найти много интересной дополнительной информации о процессе, такую как рабочая директория процесса, владелец процесса и т.д., но это выходит за рамки этой статьи.

 

Пример использования lsof

При использовании lsof введите команду по одному из шаблонов:

lsof -i :$portNumber
lsof -i tcp:$portNumber
lsof -i udp:$portNumber

Если нет, то ставим приложение

yum install lsof -y

Пример реального использования:

lsof -i :80 | grep LISTEN

Результат выполнения:

После этого мы можем получить более полную информацию о процессах с PID’ами 21390, 21400 и т.д..

ps aux | grep 21390

На выходе получим примерно следующее:

Получить информацию о процессе также можно следующим проверенным способом:

ps -eo pid,user,group,args,etime,lstart | grep '21400'

В этом выводе можно выделить следующие параметры:

  • 21400 — PID;
  • nginx — имя пользователя владельца;
  • nginx — название группы;
  • nginx: worker process — название команды с аргументами;
  • 3-05:35:00 — время работы процесса в формате [[дд-]чч:]мм:сс;
  • Tue Jan 24 15:05:06 2023 — время старта процесса.

Комментарии 1

Михаил

Для Windows - netstat -a -b

09 Jun 2023 в 12:21 UTC Ответить