При работе в Unix-системах мне частенько приходится определять, какой процесс занимает порт, например, чтобы остановить его и запустить на нём другой процесс. Поэтому я решил написать эту небольшую статью, чтоб каждый, прочитавший её, мог узнать, каким процессом занят порт в Ubuntu, CentOS или другой ОС из семейства Linux.
Как же вычислить, какие запущенные процессы соотносятся с занятыми портами? Как определить, что за процесс открыл udp-порт 2222, tcp-порт 7777 и т.п.? Получить подобную информацию мы можем нижеперечисленными методами:
- netstat
- утилита командной строки, показывающая сетевые подключения, таблицы маршрутизации и некоторую статистику сетевых интерфейсов;
- fuser
- утилита командной строки для идентификации процессов с помощью файлов или сокетов;
- lsof
- утилита командной строки, отображающая информацию об используемых процессами файлах и самих процессах в UNIX-системе;
- /proc/$pid/
- в ОС Linux
/proc
для каждого запущенного процесса содержит директорию (включая процессы ядра) в/proc/$PID
с информацией об этом процессе, в том числе и название процесса, открывшего порт. - 2727 — PID;
- www-date — имя пользователя владельца;
- www-date — название группы;
- /usr/sbin/apache2 -k start — название команды с аргументами;
- 14:27:33 — время работы процесса в формате [[дд-]чч:]мм:сс;
- Mon Nov 30 21:21:28 2015 — время старта процесса.
Использование вышеперечисленных способов может потребовать права супер-пользователя.
Теперь давайте рассмотрим каждый из этих способов по отдельности.
Пример использования 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
В этом выводе можно выделить следующие параметры:
Надеюсь, у меня получилось доступно объяснить, как определить процесс по порту в Linux-системах, и теперь у вас ни один порт не останется неопознанным!
До новых статей!