При работе в 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-системах, и теперь у вас ни один порт не останется неопознанным!
До новых статей!
Find processes based on port number and kill them all.
ps -efl | grep PORT_NUMBER | kill -9 process_found_previously
how to complete the last column?
Oleg
9,2912 gold badges43 silver badges58 bronze badges
asked Feb 18, 2011 at 16:23
0
The problem with ps -efl | grep PORT_NUMBER
is that PORT_NUMBER
may match other columns in the output of ps
as well (date, time, pid, …). A potential killing spree if run by root!
I would do this instead :
PORT_NUMBER=1234
lsof -i tcp:${PORT_NUMBER} | awk 'NR!=1 {print $2}' | xargs kill
Breakdown of command
- (
lsof -i tcp:${PORT_NUMBER}
) — list all processes that is listening on that tcp port - (
awk 'NR!=1 {print $2}'
) — ignore first line, print second column of each line - (
xargs kill
) — pass on the results as an argument tokill
. There may be several.
answered Feb 18, 2011 at 16:31
Shawn ChinShawn Chin
83.4k19 gold badges160 silver badges191 bronze badges
9
1.) lsof -w -n -i tcp:8080
2.) kill -9 processId
answered Sep 9, 2013 at 8:38
thegruntthegrunt
1,0541 gold badge11 silver badges22 bronze badges
1
kill $( lsof -i:6000 -t )
Or if you need permissions:
sudo kill $( sudo lsof -i:6000 -t )
answered Sep 6, 2012 at 8:14
DanSDanS
17.3k9 gold badges53 silver badges47 bronze badges
3
Propose to use fuser command:
fuser -k -TERM -n tcp ${PORT_NUMBER}
answered Feb 19, 2011 at 2:23
3
sudo fuser -k 8080/tcp
An easy one to remember.
This syntax is probably much more recent than the date of the question!
answered May 9, 2017 at 13:10
NVRMNVRM
11k1 gold badge85 silver badges85 bronze badges
... | awk '{ print $4 }' | xargs kill -9
please test with «echo» instead of «kill» before running
Farvardin
5,3165 gold badges33 silver badges54 bronze badges
answered Feb 18, 2011 at 16:26
vmpstrvmpstr
5,0312 gold badges25 silver badges25 bronze badges
3
To kill all processes listening on a particular port, e.g. port 8864
kill -9 $ `lsof -i:8864 -t`
Replace 8864 by the port you want.
Shawn Chin
83.4k19 gold badges160 silver badges191 bronze badges
answered Aug 23, 2011 at 17:41
Given a port number how can we find which process is using it?
asked Dec 9, 2012 at 16:14
1
We have a variety of options:
netstat
fuser
lsof
netstat
sudo netstat -nlp
will give you all open network connections.
$ netstat -nlp
(No info could be read for "-p": geteuid()=901743 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:44886 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:5666 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:8139 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:10000 0.0.0.0:* LISTEN -
tcp 0 0 127.0.0.1:81 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:48562 0.0.0.0:* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
tcp6 0 0 :::46871 :::* LISTEN -
tcp6 0 0 ::1:6010 :::* LISTEN -
tcp6 0 0 :::57179 :::* LISTEN -
tcp6 0 0 :::5666 :::* LISTEN -
tcp6 0 0 :::111 :::* LISTEN -
tcp6 0 0 :::4949 :::* LISTEN -
udp 0 0 127.0.0.1:896 0.0.0.0:* -
udp 0 0 0.0.0.0:45467 0.0.0.0:* -
udp 0 0 0.0.0.0:111 0.0.0.0:* -
udp 0 0 10.105.2.3:123 0.0.0.0:* -
udp 0 0 127.0.0.1:123 0.0.0.0:* -
udp 0 0 0.0.0.0:123 0.0.0.0:* -
udp 0 0 0.0.0.0:39554 0.0.0.0:* -
udp 0 0 0.0.0.0:711 0.0.0.0:* -
udp 0 0 0.0.0.0:10000 0.0.0.0:* -
udp6 0 0 :::53766 :::* -
udp6 0 0 :::49696 :::* -
udp6 0 0 :::111 :::* -
udp6 0 0 fe80::5054:ff:fed0::123 :::* -
udp6 0 0 ::1:123 :::* -
udp6 0 0 :::123 :::* -
udp6 0 0 :::711 :::* -
Active UNIX domain sockets (only servers)
Proto RefCnt Flags Type State I-Node PID/Program name Path
unix 2 [ ACC ] STREAM LISTENING 7943 - /var/run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 8494 - /run/rpcbind.sock
unix 2 [ ACC ] STREAM LISTENING 729659 - /var/run/mysqld/mysqld.sock
unix 2 [ ACC ] STREAM LISTENING 11324 - /var/run/php5-fpm.sock
unix 2 [ ACC ] STREAM LISTENING 11082 - /var/run/nscd/socket
unix 2 [ ACC ] STREAM LISTENING 7607 - @/com/ubuntu/upstart
unix 2 [ ACC ] STREAM LISTENING 668784 - /var/run/nslcd/socket
unix 2 [ ACC ] SEQPACKET LISTENING 6768 - /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 8924 - /var/run/acpid.socket
lsof
lsof -i tcp:43796
will give you the list of processes using tcp port 43796.
$ lsof -i tcp:1723
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
pptpd 2870 root 6u IPv4 17638 0t0 TCP *:1723 (LISTEN)
fuser
fuser 43796/tcp
will give you the list of pids using tcp port 43796.
$ fuser 1723/tcp
1723/tcp: 2870
Source
muru
191k52 gold badges467 silver badges718 bronze badges
answered Dec 9, 2012 at 16:25
HashkenHashken
6,1625 gold badges32 silver badges49 bronze badges
1
Try lsof
sudo lsof -n -P -i +c 13
Output will be like
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-daemon 1222 avahi 13u IPv4 10835 0t0 UDP *:5353
avahi-daemon 1222 avahi 14u IPv6 10836 0t0 UDP *:5353
avahi-daemon 1222 avahi 15u IPv4 10837 0t0 UDP *:32913
avahi-daemon 1222 avahi 16u IPv6 10838 0t0 UDP *:41774
cupsd 1242 root 8u IPv6 1847 0t0 TCP [::1]:631 (LISTEN)
cupsd 1242 root 9u IPv4 1848 0t0 TCP 127.0.0.1:631 (LISTEN)
dhclient 1859 root 6u IPv4 11971 0t0 UDP *:68
gdomap 1876 nobody 3u IPv4 11083 0t0 UDP *:538
gdomap 1876 nobody 4u IPv4 11084 0t0 TCP *:538 (LISTEN)
master 1975 root 12u IPv4 12024 0t0 TCP 127.0.0.1:25 (LISTEN)
master 1975 root 13u IPv6 12025 0t0 TCP [::1]:25 (LISTEN)
dnsmasq 1987 nobody 4w IPv4 12039 0t0 UDP 127.0.0.1:53
dnsmasq 1987 nobody 5u IPv4 12040 0t0 TCP 127.0.0.1:53 (LISTEN)
firefox 4370 shashank 50u IPv4 18226 0t0 TCP 192.168.1.2:33467->69.171.248.16:443 (ESTABLISHED)
Or Try netstat
sudo netstat --tcp --programs
output will be like
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 29 0 192.168.1.2:44054 69.59.197.29:http ESTABLISHED 4370/firefox
tcp 0 0 192.168.1.2:44087 69.59.197.29:http ESTABLISHED 4370/firefox
tcp 58 0 192.168.1.2:43895 69.59.197.29:http ESTABLISHED 4370/firefox
tcp 58 0 192.168.1.2:43935 69.59.197.29:http ESTABLISHED 4370/firefox
answered Dec 9, 2012 at 17:06
shshshsh
1937 bronze badges
lsof -t -itcp:PORT
e.g
$ lsof -t -itcp:8080
17396
A.B.
88.5k21 gold badges245 silver badges321 bronze badges
answered Jun 17, 2015 at 14:56
Eyal LevinEyal Levin
5316 silver badges13 bronze badges
Однажды вам обязательно понадобится проверить используемый порт определенного сервиса (или наоборот, найти сервисы, слушающие конкретный порт) — в Linux существует несколько утилит командной строки, которые могут с этим помочь. Давайте разберемся!
Первым делом на ум приходит утилита netstat
, с помощью которой можно проверить сетевые соединения, статистику сетевых интерфейсов, таблицу маршрутизации и т. д.
Устанавливается данная утилита в разных дистрибутивах по-разному, например, для RedHat и CentOS:
sudo yum install net-tools
Fedora 22+:
Debian/Ubuntu:
sudo apt-get install net-tools
Для вывода детальной информации о всех TCP и UDP ендпоинтах можно воспользоваться следующей командой:
Вывод будет примерно следующим:
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.53:53 0.0.0.0:* LISTEN 1323/systemd-resolv
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1661/sshd
tcp 0 0 127.0.0.1:17123 0.0.0.0:* LISTEN 1753/python
tcp6 0 0 :::31341 :::* LISTEN 30068/java
tcp6 0 0 :::22222 :::* LISTEN 30068/java
tcp6 0 0 :::80 :::* LISTEN 30068/java
tcp6 0 0 :::10769 :::* LISTEN 126755/docker-proxy
tcp6 0 0 :::10770 :::* LISTEN 129459/docker-proxy
tcp6 0 0 :::10771 :::* LISTEN 129540/docker-proxy
tcp6 0 0 :::10772 :::* LISTEN 130172/docker-proxy
tcp6 0 0 :::10773 :::* LISTEN 130187/docker-proxy
tcp6 0 0 :::10774 :::* LISTEN 130545/docker-proxy
tcp6 0 0 :::22 :::* LISTEN 1661/sshd
tcp6 0 0 :::10775 :::* LISTEN 7406/docker-proxy
Здесь:
-p
— вывод ID процесса и его имени;-n
— вывод адресов;-l
— вывод сокетов;-t
— вывод TCP соединений;-u
— вывод UDP соединений.
Найти сервис, запущенный на определенном порту можно так:
netstat -pnltu | grep -i "22"
Аналогично можно найти на каком порту запущен определенный сервис:
netstat -pnltu | grep -i "sshd"
Также для наших целей подойдет утилита командной строки fuser
. По умолчанию она не установлена в большинстве операционных систем, чтобы установить ее в Centos/RedHat делаем так:
Fedora 22+
Debian/Ubuntu
Например, чтобы найти идентификаторы процессов (PIDs), запущенных на 80-м порту, выполняем команду:
Результат выполнения будет примерно следующим:
22/tcp: 1661 105268 105302
Далее можем найти имя процесса по его идентификатору (PID):
Результат:
Еще один способ — использование утилиты lsof
. Установка ее в RedHat/CentOS выглядит так:
Fedora 22+
Debian/Ubuntu:
Вывод всех активных TCP и UPD соединений:
Результатом будет примерно следующее:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 1323 systemd-resolve 12u IPv4 20197 0t0 UDP 127.0.0.53:domain
systemd-r 1323 systemd-resolve 13u IPv4 20198 0t0 TCP 127.0.0.53:domain (LISTEN)
sshd 1661 root 3u IPv4 29741 0t0 TCP *:ssh (LISTEN)
sshd 1661 root 4u IPv6 29743 0t0 TCP *:ssh (LISTEN)
python 1754 dd-agent 4u IPv6 39499 0t0 UDP localhost.localdomain:8125
docker-pr 7406 root 4u IPv6 287933991 0t0 TCP *:10775 (LISTEN)
docker-pr 7459 root 4u IPv6 287906596 0t0 TCP *:10776 (LISTEN)
docker-pr 7792 root 4u IPv6 287937795 0t0 TCP *:10777 (LISTEN)
docker-pr 8435 root 4u IPv6 287955267 0t0 TCP *:10778 (LISTEN)
docker-pr 8447 root 4u IPv6 287915222 0t0 TCP *:10779 (LISTEN)
docker-pr 9060 root 4u IPv6 287891442 0t0 TCP *:10780 (LISTEN)
docker-pr 9429 root 4u IPv6 287957044 0t0 TCP *:10781 (LISTEN)
docker-pr 9463 root 4u IPv6 287921075 0t0 TCP *:10782 (LISTEN)
ntpd 10594 ntp 16u IPv6 35365570 0t0 UDP *:ntp
Проверить использование конкретного порта можно так:
Результат:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 1661 root 3u IPv4 29741 0t0 TCP *:ssh (LISTEN)
sshd 1661 root 4u IPv6 29743 0t0 TCP *:ssh (LISTEN)
Напоследок можно также воспользоваться утилитой whatportis
. Ее установка в RedHat/Centos требует чуть больше действий:
yum install python34-setuptools
В Debian/Ubuntu все гораздо проще:
В общем виде использование утилиты выглядит так:
whatportis [номер_порта | имя_сервиса]
Если вам неизвестно точное имя сервиса, можно воспользоваться опцией --like
, например:
Также доступен вывод информации в json-формате:
A port is a logical entity that represents an endpoint of communication and is associated with a given process or service in an operating system. In previous articles, we explained how to find out the list of all open ports in Linux and how to check if remote ports are reachable using the Netcat command.
In this short guide, we will show different ways of finding the process/service listening on a particular port in Linux.
1. Using netstat Command
netstat (network statistics) command is used to display information concerning network connections, routing tables, interface stats, and beyond. It is available on all Unix-like operating systems including Linux and also on Windows OS.
In case you do not have it installed by default, use the following command to install it.
$ sudo apt-get install net-tools [On Debian/Ubuntu & Mint] $ sudo dnf install net-tools [On CentOS/RHEL/Fedora and Rocky Linux/AlmaLinux] $ pacman -S netstat-nat [On Arch Linux] $ emerge sys-apps/net-tools [On Gentoo] $ sudo dnf install net-tools [On Fedora] $ sudo zypper install net-tools [On openSUSE]
Once installed, you can use it with the grep command to find the process or service listening on a particular port in Linux as follows (specify the port).
$ netstat -ltnp | grep -w ':80'
In the above command, the flags.
l
– tells netstat to only show listening sockets.t
– tells it to display tcp connections.n
– instructs it to show numerical addresses.p
– enables showing of the process ID and the process name.grep -w
– shows matching of exact string (:80).
Note: The netstat command is deprecated and replaced by the modern ss command in Linux.
2. Using lsof Command
lsof command (List Open Files) is used to list all open files on a Linux system.
To install it on your system, type the command below.
$ sudo apt-get install lsof [On Debian, Ubuntu and Mint] $ sudo yum install lsof [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux] $ sudo emerge -a sys-apps/lsof [On Gentoo Linux] $ sudo pacman -S lsof [On Arch Linux] $ sudo zypper install lsof [On OpenSUSE]
To find the process/service listening on a particular port, type (specify the port).
$ lsof -i :80
3. Using fuser Command
fuser command shows the PIDs of processes using the specified files or file systems in Linux.
You can install it as follows:
$ sudo apt-get install psmisc [On Debian, Ubuntu and Mint] $ sudo yum install psmisc [On RHEL/CentOS/Fedora and Rocky Linux/AlmaLinux] $ sudo emerge -a sys-apps/psmisc [On Gentoo Linux] $ sudo pacman -S psmisc [On Arch Linux] $ sudo zypper install psmisc [On OpenSUSE]
You can find the process/service listening on a particular port by running the command below (specify the port).
$ fuser 80/tcp
Then find the process name using PID number with the ps command like so.
$ ps -p 2053 -o comm= $ ps -p 2381 -o comm=
You can also check out these useful guides about processes in Linux.
- All You Need To Know About Processes in Linux [Comprehensive Guide]
- Limit CPU Usage of a Process in Linux with CPULimit Tool
- How to Find and Kill Running Processes in Linux
- Find Top Running Processes by Highest Memory and CPU Usage in Linux
That’s all! Do you know of any other ways of finding the process/service listening on a particular port in Linux, let us know via the comment form below.
If you read this far, tweet to the author to show them you care. Tweet a thanks
Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge.
Each tutorial at TecMint is created by a team of experienced Linux system administrators so that it meets our high-quality standards.