Menentukan proses apa yang terikat pada port

90

Saya tahu bahwa menggunakan perintah:

lsof -i TCP 

(atau beberapa varian parameter dengan lsof) Saya dapat menentukan proses mana yang terikat pada port tertentu. Ini berguna katakan jika saya mencoba memulai sesuatu yang ingin mengikat ke 8080 dan ada yang sudah menggunakan port itu, tapi saya tidak tahu apa.

Apakah ada cara mudah untuk melakukan ini tanpa menggunakan lsof? Saya menghabiskan waktu bekerja di banyak sistem dan sering tidak diinstal.

Gilles
sumber

Jawaban:

112

netstat -lnpakan mencantumkan pid dan nama proses di sebelah setiap port mendengarkan. Ini akan bekerja di Linux, tetapi tidak semua yang lain (seperti AIX.) Tambahkan -tjika Anda ingin TCP saja.

# 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

dll.

Cakemox
sumber
Keren Terimakasih. Sepertinya itu bekerja di bawah RHEL, tetapi tidak di bawah Solaris (seperti yang Anda sebutkan). Adakah yang tahu kalau ada yang serupa untuk Solaris?
netstat -pdi atas adalah suara saya. lihat juga lsof.
Rich Homolka
Selain itu, untuk windows mirip: netstat -aon | lebih
Jonathan
Bagaimana dengan SCTP?
sudo
12

Pada AIX, netstat & rmsock dapat digunakan untuk menentukan proses pengikatan:

[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).
Frielp
sumber
1
Terima kasih untuk ini! Namun, apakah ada cara untuk hanya menampilkan proses mendengarkan pada soket (alih-alih menggunakan rmsock yang berupaya melepaskannya)?
Olivier Dulac
2
@OlivierDulac: "Tidak seperti namanya, rmsock tidak melepas soket, jika sedang digunakan oleh suatu proses. Itu hanya melaporkan proses memegang soket." ( ibm.com/developerworks/community/blogs/cgaix/entry/… )
Vitor Py
@ vitor-braga: Ah thx! Saya pikir itu mencoba tetapi hanya mengatakan proses mana yang bertahan ketika tidak bisa menghapusnya. Tampaknya itu bahkan tidak mencoba untuk menghapusnya ketika suatu proses menahannya. Itu keren! Terima kasih!
Olivier Dulac
8

Alat lain yang tersedia di Linux adalah ss . Dari halaman manual ss di 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.

Contoh output di bawah ini - kolom terakhir menunjukkan proses yang mengikat:

[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))
Frielp
sumber
3

Untuk Solaris Anda dapat menggunakan pfiles dan kemudian grep oleh sockname:atau port:.

Sampel (dari sini ):

pfiles `ptree | awk '{print $1}'` | egrep '^[0-9]|port:'
Eugen Constantin Dinca
sumber
2

Saya pernah dihadapkan pada upaya untuk menentukan proses apa yang ada di balik port tertentu (kali ini 8000). Saya mencoba berbagai lsof dan netstat, tetapi kemudian mengambil kesempatan dan mencoba memukul port melalui browser (yaitu http: // hostname: 8000 / ). Lihatlah, layar splash menyambut saya, dan menjadi jelas apa prosesnya (sebagai catatan, itu Splunk ).

Satu lagi pemikiran: "ps -e -o pid, args" (YMMV) kadang-kadang dapat menampilkan nomor port dalam daftar argumen. Grep adalah temanmu!

rickumali
sumber
Dalam nada yang sama, Anda bisa telnet hostname 8000dan melihat apakah server mencetak spanduk. Namun, itu sebagian besar berguna ketika server berjalan pada mesin di mana Anda tidak memiliki akses shell, dan kemudian menemukan ID proses tidak relevan.
Gilles