Визначення того, який процес пов'язаний з портом


90

Я знаю, що за допомогою команди:

lsof -i TCP 

(або якийсь варіант параметрів з lsof) Я можу визначити, який процес пов'язаний з певним портом. Це корисно сказати, якщо я намагаюся запустити щось, що хоче прив’язати до 8080, а хтось уже використовує цей порт, але я не знаю, що.

Чи є простий спосіб зробити це без використання lsof? Я проводжу час, працюючи над багатьма системами, і lsof часто не встановлюється.

Відповіді:


112

netstat -lnpвідобразить назву pid та ім’я процесу біля кожного порту прослуховування. Це буде працювати під Linux, але не всі інші (як AIX.) Додайте, -tякщо ви хочете лише TCP.

# netstat -lntp
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:24800           0.0.0.0:*               LISTEN      27899/synergys
tcp        0      0 0.0.0.0:8000            0.0.0.0:*               LISTEN      3361/python
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      2264/mysqld
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      22964/apache2
tcp        0      0 192.168.99.1:53         0.0.0.0:*               LISTEN      3389/named
tcp        0      0 192.168.88.1:53         0.0.0.0:*               LISTEN      3389/named

тощо.


Класно, дякую. Схоже, що це працює під RHEL, але не під Solaris (як ви вказали). Хтось знає, чи є щось подібне для Solaris?

netstat -pвище мій голос. також дивись lsof.
Багата Гомолка

Як і в стороні, для Windows це схоже: netstat -aon | детальніше
Джонатан

А як щодо SCTP?
судо

12

На AIX, netstat & rmsock можна використовувати для визначення зв'язування процесу:

[root@aix] netstat -Ana|grep LISTEN|grep 80
f100070000280bb0 tcp4       0      0  *.37               *.*        LISTEN
f1000700025de3b0 tcp        0      0  *.80               *.*        LISTEN
f1000700002803b0 tcp4       0      0  *.111              *.*        LISTEN
f1000700021b33b0 tcp4       0      0  127.0.0.1.32780    *.*        LISTEN

# Port 80 maps to f1000700025de3b0 above, so we type:
[root@aix] rmsock f1000700025de3b0 tcpcb
The socket 0x25de008 is being held by process 499790 (java).

1
Дякую за це! Чи є спосіб просто відобразити, який процес прослуховування в сокеті (замість того, щоб використовувати rmsock, який намагається його видалити)?
Олів'є Дулак

2
@OlivierDulac: "На відміну від того, що випливає з його назви, rmsock не видаляє сокет, якщо він використовується процесом. Він просто повідомляє про процес, що містить сокет." ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py

@ vitor-braga: Ах, THX! Я думав, що це намагається, але просто сказав, який процес має місце, коли він не зміг його зняти. Мабуть, він навіть не намагається видалити його, коли процес утримує його. Круто! Дякую!
Олів'є Дулак

8

Іншим інструментом, доступним на Linux, є ss . На сторінці ss man у Fedora:

NAME
       ss - another utility to investigate sockets
SYNOPSIS
       ss [options] [ FILTER ]
DESCRIPTION
       ss is used to dump socket statistics. It allows showing information 
       similar to netstat. It can display more TCP and state informations  
       than other tools.

Приклад виводу нижче - в остаточному стовпці показано зв'язування процесу:

[root@box] ss -ap
State      Recv-Q Send-Q      Local Address:Port          Peer Address:Port
LISTEN     0      128                    :::http                    :::*        users:(("httpd",20891,4),("httpd",20894,4),("httpd",20895,4),("httpd",20896,4)
LISTEN     0      128             127.0.0.1:munin                    *:*        users:(("munin-node",1278,5))
LISTEN     0      128                    :::ssh                     :::*        users:(("sshd",1175,4))
LISTEN     0      128                     *:ssh                      *:*        users:(("sshd",1175,3))
LISTEN     0      10              127.0.0.1:smtp                     *:*        users:(("sendmail",1199,4))
LISTEN     0      128             127.0.0.1:x11-ssh-offset                  *:*        users:(("sshd",25734,8))
LISTEN     0      128                   ::1:x11-ssh-offset                 :::*        users:(("sshd",25734,7))


2

Я колись стикався з спробою визначити, який процес стоїть за певним портом (цього разу це було 8000). Я спробував різноманітні lsof та netstat, але потім ризикнув і спробував потрапити на порт через браузер (тобто http: // ім'я хоста: 8000 / ). Ось, ось, мене висловив заставний екран, і стало очевидно, що це за процес (для запису, це був Splunk ).

Ще одна думка: "ps -e -o pid, args" (YMMV) іноді може відображати номер порту в списку аргументів. Греп - твій друг!


У цьому ж ключі ви могли telnet hostname 8000побачити, чи сервер друкує банер. Однак це в основному корисно, коли сервер працює на машині, де ви не маєте доступу до оболонки, і тоді пошук ідентифікатора процесу не має значення.
Жиль
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.