Как найти процесс по номеру порта в linux
При работе в 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 — время старта процесса.
Для Windows - netstat -a -b
09 Jun 2023 в 12:21 UTC Ответить