Określanie procesu powiązanego z portem


90

Wiem, że za pomocą polecenia:

lsof -i TCP 

(lub jakiś wariant parametrów z lsof) Mogę określić, który proces jest powiązany z określonym portem. Przydaje się to, jeśli próbuję uruchomić coś, co chce się połączyć z 8080, a niektóre inne już korzystają z tego portu, ale nie wiem co.

Czy istnieje prosty sposób, aby to zrobić bez użycia lsof? Pracuję nad wieloma systemami, a lsof często nie jest zainstalowany.

Odpowiedzi:


112

netstat -lnpwyświetli listę pid i nazwę procesu obok każdego portu nasłuchującego. Działa to pod Linuksem, ale nie ze wszystkimi innymi (jak AIX.) Dodaj, -tjeśli chcesz tylko 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

itp.


Fajne dzięki. Wygląda na to, że działa pod RHEL, ale nie pod Solaris (jak wskazałeś). Czy ktoś wie, czy jest coś podobnego do Solaris?

netstat -ppowyżej jest mój głos. też spójrz na lsof.
Rich Homolka

Nawiasem mówiąc, dla systemu Windows jest podobnie: netstat -aon | więcej
Jonathan

Co z SCTP?
sudo,

12

W systemie AIX można użyć netstat i rmsock do określenia powiązania procesu:

[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
Dzięki za to! Czy jest jednak sposób, aby po prostu wyświetlić, jaki proces nasłuchuje na gnieździe (zamiast używać rmsock, który próbuje go usunąć)?
Olivier Dulac,

2
@OlivierDulac: „W przeciwieństwie do tego, co sugeruje jego nazwa, rmsock nie usuwa gniazda, jeśli jest używane przez proces. Po prostu zgłasza proces trzymający gniazdo.” ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py

@ vitor-braga: Ah thx! Myślałem, że to próbuje, ale po prostu powiedziałem, który proces się zatrzymuje, gdy nie można go usunąć. Najwyraźniej nawet nie próbuje go usunąć, gdy proces go wstrzymuje. To super! Dzięki!
Olivier Dulac,

8

Kolejnym narzędziem dostępnym w systemie Linux jest ss . Ze strony podręcznika ss w Fedorze:

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.

Przykładowe dane wyjściowe poniżej - ostatnia kolumna pokazuje powiązanie procesu:

[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

Kiedyś stanąłem przed próbą ustalenia, który proces był za danym portem (tym razem było to 8000). Próbowałem różnych lsof i netstat, ale potem zaryzykowałem i spróbowałem uderzyć w port za pośrednictwem przeglądarki (np. Http: // nazwa hosta: 8000 / ). Oto powitalny ekran powitalny i stało się jasne, co to był za proces (dla przypomnienia, był to Splunk ).

Jeszcze jedna myśl: „ps -e -o pid, args” (YMMV) może czasami pokazywać numer portu na liście argumentów. Grep jest twoim przyjacielem!


W tym samym duchu możesz telnet hostname 8000sprawdzić, czy serwer wydrukuje baner. Jest to jednak szczególnie przydatne, gdy serwer działa na komputerze, na którym nie masz dostępu do powłoki, a następnie znalezienie identyfikatora procesu nie jest istotne.
Gilles
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.