Найти процесс по номеру порта в Linux

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

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

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

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

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

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

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

$ netstat -tulpn

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

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:10843           0.0.0.0:*               LISTEN      7023/node           
tcp        0      0 127.0.0.1:4942          0.0.0.0:*               LISTEN      3413/java           
...

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

$ ls -l /proc/3413/exe

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

lrwxrwxrwx. 1 user user 0 Nov 10 20:31 /proc/3413/exe -> /opt/jdk1.8.0_60/bin/java

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

$ netstat -tulpn | grep ':80 '

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

tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1607/apache2

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

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

$ fuser 5050/tcp

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

5050/tcp:             3813

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

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

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

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

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

lsof -i :80 | grep LISTEN

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

apache2   2123     root    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   2124 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   2125 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)
apache2   2126 www-data    3u  IPv4   6472      0t0  TCP *:www (LISTEN)

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

$ ps aux | grep 2124

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

www-data 2124 0.0 0.0 36927 4991 ? S 10:20 0:00 /usr/sbin/apache2 -k start

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

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

2727 www-data www-data /usr/sbin/apache2 -k start     14:27:33 Mon Nov 30 21:21:28 2015

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

  • 2727 — PID;
  • www-date — имя пользователя владельца;
  • www-date — название группы;
  • /usr/sbin/apache2 -k start — название команды с аргументами;
  • 14:27:33 — время работы процесса в формате [[дд-]чч:]мм:сс;
  • Mon Nov 30 21:21:28 2015 — время старта процесса.

Надеюсь, у меня получилось доступно объяснить, как определить процесс по порту в Linux-системах, и теперь у вас ни один порт не останется неопознанным!

До новых статей!