Как найти процесс по номеру порта в linux
При работе в Unix-системах частенько приходится определять, какой процесс занимает порт, например, чтобы остановить его и запустить на нём другой процесс. Поэтому я решил написать эту небольшую статью, чтоб каждый, прочитавший её, мог узнать, каким процессом занят порт в Ubuntu, CentOS или другой ОС из семейства Linux.
Как же вычислить, какие запущенные процессы соотносятся с занятыми портами? Как определить, что за процесс открыл udp-порт 22, tcp-порт 443 и т.п.? Получить подобную информацию мы можем нижеперечисленными методами:
netstat | утилита командной строки, показывающая сетевые подключения, таблицы маршрутизации и некоторую статистику сетевых интерфейсов; |
fuser | утилита командной строки для идентификации процессов с помощью файлов или сокетов; |
lsof | утилита командной строки, отображающая информацию об используемых процессами файлах и самих процессах в UNIX-системе; |
/proc/$pid/ | в ОС Linux /proc для каждого запущенного процесса содержит директорию (включая процессы ядра) в /proc/$PID с информацией об этом процессе, в том числе и название процесса, открывшего порт. |
Использование вышеперечисленных способов может потребовать права супер-пользователя.
Теперь давайте рассмотрим каждый из этих способов по отдельности.
Пример использования netstat
Введём в командную строку команду:
netstat -tulpn
Получим примерно такой результат:
![](/content/img/950f5fbe-2b29-485a-b285-e4e035402a59.png)
Из вывода видно, что 1540-й порт был открыт ragent с PID’ом 1758. Правильно, это же сервер 1С. Проверить это можно через /proc
:
ls -l /proc/1758/exe
Примерный результат выполнения команды:
![](/content/img/2848608a-386e-4d3e-907d-e054a4b0f470.png)
При необходимости получения информации по конкретному порту (например, 80-му, используемого обычно для HTTP) вместо отображения всей таблицы можно grep
-ануть результат:
netstat -tulpn | grep ':80'
Результат будет примерно такой:
![](/content/img/94b5a91c-51f8-4ca6-bc1e-df8c66b6b222.png)
Пример использования fuser
Если нет приложения, то ставим
yum install psmisc -y
Для того, чтобы вычислить процесс, занимающий порт 22, введём команду:
fuser 22/tcp
И получим результат:
![](/content/img/1a9d47bf-66ca-414c-a3f0-16a4e1fc3ddc.png)
Аналогичным образом, как мы делали выше, можно посмотреть процесс в его директории /proc/$PID
, в которой можно найти много интересной дополнительной информации о процессе, такую как рабочая директория процесса, владелец процесса и т.д., но это выходит за рамки этой статьи.
Пример использования lsof
При использовании lsof введите команду по одному из шаблонов:
lsof -i :$portNumber
lsof -i tcp:$portNumber
lsof -i udp:$portNumber
Если нет, то ставим приложение
yum install lsof -y
Пример реального использования:
lsof -i :80 | grep LISTEN
Результат выполнения:
![](/content/img/fc696b2c-9857-4a25-ade1-146b1370ec90.png)
После этого мы можем получить более полную информацию о процессах с PID’ами 21390, 21400 и т.д..
ps aux | grep 21390
На выходе получим примерно следующее:
![](/content/img/a66c0d6f-0e83-4d1a-a761-dce679584fc9.png)
Получить информацию о процессе также можно следующим проверенным способом:
ps -eo pid,user,group,args,etime,lstart | grep '21400'
![](/content/img/dd1c0097-54be-4c80-8334-747b36f229c0.png)
В этом выводе можно выделить следующие параметры:
- 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 Ответить