- Найти процесс по номеру порта в Linux
- Пример использования netstat
- Пример использования fuser
- Пример использования lsof
- Кто слушает порт в Linux
- Команда lsof для выяснения, какой процесс занимает порт TCP
- Как с помощью команды lsof выяснить процесс, который слушает нужный порт в Debian 9
- Как узнать, какая программа слушает порт 22 (ssh) с помощью команды lsof
- Как остановить процесс, который слушает порт на сервере
- Linux: выясняем, что использует TCP Port 80
- Примеры
- Команда netstat выяснит, что использует порт 80
- Используйте файл /proc/$pid/exec, чтобы выяснить, чем занят порт 80
- Команда lsof выясняет, кто использует порт 80
Найти процесс по номеру порта в Linux
При работе в Unix-системах мне частенько приходится определять, какой процесс занимает порт, например, чтобы остановить его и запустить на нём другой процесс. Поэтому я решил написать эту небольшую статью, чтоб каждый, прочитавший её, мог узнать, каким процессом занят порт в Ubuntu, CentOS или другой ОС из семейства Linux.
Как же вычислить, какие запущенные процессы соотносятся с занятыми портами? Как определить, что за процесс открыл udp-порт 2222, tcp-порт 7777 и т.п.? Получить подобную информацию мы можем нижеперечисленными методами:
netstat утилита командной строки, показывающая сетевые подключения, таблицы маршрутизации и некоторую статистику сетевых интерфейсов; fuser утилита командной строки для идентификации процессов с помощью файлов или сокетов; lsof утилита командной строки, отображающая информацию об используемых процессами файлах и самих процессах в UNIX-системе; /proc/$pid/ в ОС Linux /proc для каждого запущенного процесса содержит директорию (включая процессы ядра) в /proc/$PID с информацией об этом процессе, в том числе и название процесса, открывшего порт.
Использование вышеперечисленных способов может потребовать права супер-пользователя.
Теперь давайте рассмотрим каждый из этих способов по отдельности.
Пример использования netstat
Введём в командную строку команду:
Получим примерно такой результат:
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 :
Примерный результат выполнения команды:
lrwxrwxrwx. 1 user user 0 Nov 10 20:31 /proc/3413/exe -> /opt/jdk1.8.0_60/bin/java
При необходимости получения информации по конкретному порту (например, 80-му, используемого обычно для HTTP) вместо отображения всей таблицы можно grep -ануть результат:
Результат будет примерно такой:
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1607/apache2
Пример использования fuser
Для того, чтобы вычислить процесс, занимающий порт 5050, введём команду:
Аналогичным образом, как мы делали выше, можно посмотреть процесс в его директории /proc/$PID , в которой можно найти много интересной дополнительной информации о процессе, такую как рабочая директория процесса, владелец процесса и т.д., но это выходит за рамки этой статьи.
Пример использования lsof
При использовании lsof введите команду по одному из шаблонов:
lsof -i :$portNumber lsof -i tcp:$portNumber lsof -i udp:$portNumber
Пример реального использования:
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 и т.д..
На выходе получим примерно следующее:
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-системах, и теперь у вас ни один порт не останется неопознанным!
Кто слушает порт в Linux
Открытый доступ к порту хоть и является угрозой безопасности системы, но по сути ничего плохого не представляет до тех пор, пока его не начинает использовать программа. А чтобы выяснить какая программа слушает какой порт можно использовать утилиты «netstat» (или «ss») и «lsof».
Чтобы узнать информацию о программе, которая прослушивает определённый порт, можно воспользоваться командой «lsof» со следующими ключами:
Здесь «номер_порта» — это цифра.
Пример результата выполнения команды с 53 портом:
$: sudo lsof -i :53 COMMAND PID USER TYPE NODE NAME systemd-r 818 systemd-resolve IPv4 UDP localhost:domain systemd-r 818 systemd-resolve IPv4 TCP localhost:domain (LISTEN)
Но рекомендуем чаще запускать команду для получения списка программ, которые используют какие-либо tcp/udp порты. В этом помогает «netstat» или «ss»:
- -l показать только прослушиваемые «LISTEN» порты.
- -n показывать адреса как ip, а не пытаться определять домены.
- -t показывать TCP порты.
- -u показывать UDP порты.
- -p показать название программы, которая слушает порт.
$: sudo netstat -lntup Prt Local Addr State PID/Program tcp 0.0.0.0:443 LISTEN 204/nginx tcp 0.0.0.0:80 LISTEN 202/nginx tcp 0.0.0.0:22 LISTEN 174/sshd udp 127.0.0.1:323 233/chronyd
По результату можно заметить какая программа прослушивает какой порт. Если ip в секции «Local Address» равен «127.0.0.1», то это локальное обращение. Такой порт можно не закрывать фаерволом — он и так не будет доступен извне. Но ip с нулями «0.0.0.0» говорят о том, что программа слушает все адреса. То есть она примет любой запрос, в том числе внешний.
Команда lsof для выяснения, какой процесс занимает порт TCP
Несколько раз случалось такое, что мне не удавалось стандартными средствами перезапустить NGiNX на сервере. Просто игнорировались все команды, и хоть ты тресни. Оставалось только одно средство — «убить» процесс командой kill , но для её запуска требуется знать PID процесса. И тут потребовалось перепробовать массу вариантов, как его узнать, пока я не наткнулся на полезную команду, которая есть в стандартном дистрибутиве Debian 9 lsof , которая и спасла в итоге ситуацию.
Как с помощью команды lsof выяснить процесс, который слушает нужный порт в Debian 9
Читать документацию по lsof пока нет желания, поэтому сразу к делу. Для того, чтобы определить, какой процесс в linux занимает 80-й порт, требуется ввести команду:
Для того, чтобы узнать программы, слушающие другие порты, вместо 80, нужно указать номер нужного порта. Например, для порта 8080 команда будет выглядеть так:
Как узнать, какая программа слушает порт 22 (ssh) с помощью команды lsof
В качестве примера того, как и в каком формате выдаёт данные команда lsof , рассмотрим, что у нас в системе слушает ssh — порт 22:
[email protected]:~# lsof -i :22 | grep LISTEN sshd 777 root 3u IPv4 16470 0t0 TCP *:ssh (LISTEN) sshd 777 root 4u IPv6 16472 0t0 TCP *:ssh (LISTEN)
- название процесса sshd
- PID процесса 777
- пользователь, под которым запущен процесс root
Как остановить процесс, который слушает порт на сервере
Узнав PID процесса, никто не помещает его остановить командой kill :
Вместо 777 нужно ввести PID того, процесса, который требуется остановить (если больше ничего не помогает). Ну и для того, чтобы «убить» процесс наверняка, можно использовать опцию -9. Результат — всегда срабатывает:
Но, лучше всё-таки, когда до kill дело не доходит и всё останавливается и запускается, в общем, реагирует по сценарию того процесса, которым требуется управлять.
Заберите ссылку на статью к себе, чтобы потом легко её найти!
Раз уж досюда дочитали, то может может есть желание рассказать об этом месте своим друзьям, знакомым и просто мимо проходящим?
Не надо себя сдерживать! 😉
Linux: выясняем, что использует TCP Port 80
Как я могу выяснить, что использует tcp port 80 на Linux системе при помощи параметров командной строки?
Вы можете использовать любую из следующих команд, чтобы выяснить, чем занимается tcp или udp port 80 на операционных системах Linux:
- netstat – тулза командной строки, которая отображает сетевые соединения, таблицы маршрутизации, а также номер статистики сетевого интерфейса.
- fuser – тулза командной строки, которая определяет процессы, использующие файлы.
- lsof – тулза командной строки перечня списка открытых файлов под Linux/UNIX для составления списка всех открытых файлов и процессов, которые открыли их.
- /proc/$pid/ file system – Under Linux/proc включает в себя директорию для каждого запущенного процесса (в том числе процессов ядра) в /proc/PID, содержащее сведения об этом процессе, в частности, в том числе названия процесса, который открыл порт.
Примеры
Откройте терминал и введите следующую команду от имени суперпользователя:
Команда netstat выяснит, что использует порт 80
Введите следующую команду
# netstat -tulpn | grep --color :80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1215/nginx
TCP port 80 открывается и используется при помощи веб-сервера nginx. Введите следующую команду, чтобы узнать больше о nginx:
whatis nginx whereis nginx
Примечание: Возможно, вам придется установить lsof и fuser.
Используйте файл /proc/$pid/exec, чтобы выяснить, чем занят порт 80
Сначала найдем PID процессы, которые открыли tcp port 90, введите:
80/tcp: 12161 21776 25250 25393
И, наконец, узнаем название процесса, связанным с PID#3813, введите:
lrwxrwxrwx. 1 root root 0 Aug 9 13:28 /proc/12161/exe -> /usr/sbin/lighttpd
man lighttpd whatis lighttpd whereis lighttpd
lighttpd (8) - a fast, secure and flexible web server lighttpd: /usr/sbin/lighttpd /usr/lib64/lighttpd /usr/share/man/man8/lighttpd.8.gz
Вы можете использовать менеджер пакетов, чтобы полазить в lighttpd:
Чтобы узнать больше о lighttpd-1.4.32-1.el6.x86_64 пакета, введите:
# yum info lighttpd-1.4.32-1.el6.x86_64
Loaded plugins: auto-update-debuginfo, protectbase, rhnplugin, security This system is receiving updates from RHN Classic or RHN Satellite. 0 packages excluded due to repository protections Installed Packages Name : lighttpd Arch : x86_64 Version : 1.4.32 Release : 1.el6 Size : 664 k Repo : installed Summary : A web server more optimized for speed-critical environments. URL : http://lighttpd.net/ License : Revised BSD Description : It is a secure and fast web server a very low memory footprint compared : to other webservers and takes care of cpu-load.
Или воспользоваться командой rpm:
Name : lighttpd Relocations: (not relocatable) Version : 1.4.32 Vendor: nixCraft Release : 1.el6 Build Date: Sun 03 Feb 2013 03:22:08 AM CST Install Date: Mon 04 Feb 2013 04:44:26 AM CST Build Host: rhel6.nixcraft.net.in Group : System Environment/Daemons Source RPM: lighttpd-1.4.32-1.el6.src.rpm Size : 680402 License: Revised BSD Signature : (none) URL : http://lighttpd.net/ Summary : A web server more optimized for speed-critical environments. Description : It is a secure and fast web server a very low memory footprint compared to other webservers and takes care of cpu-load.
Пользователи Debian/Ubuntu Linux могут использовать следующие команды:
# dpkg --list | grep lighttpd # apt-cache search lighttpd # apt-cache show lighttpd
Пример выхода из последней команды:
Package: lighttpd Priority: optional Section: universe/web Installed-Size: 841 Maintainer: Ubuntu Developers Original-Maintainer: Debian lighttpd maintainers Architecture: amd64 Version: 1.4.28-2ubuntu4 Provides: httpd, httpd-cgi Depends: libattr1 (>= 1:2.4.46-5), libbz2-1.0, libc6 (>= 2.4), libgamin0 | libfam0, libldap-2.4-2 (>= 2.4.7), libpcre3 (>= 8.10), libssl1.0.0 (>= 1.0.0), zlib1g (>= 1:1.1.4), lsb-base (>= 3.2-14), mime-support, libterm-readline-perl-perl Recommends: spawn-fcgi Suggests: openssl, rrdtool, apache2-utils, ufw Conflicts: cherokee (Команда lsof выясняет, кто использует порт 80
Введите следующую команду
apache2 1607 root 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1616 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN) apache2 1617 www-data 3u IPv4 6472 0t0 TCP *:www (LISTEN)