Menemukan PID proses menggunakan port tertentu?

392

Saya menginstal hadoop pada sistem Ubuntu saya. Ketika saya memulainya, ia melaporkan bahwa port 9000 sedang sibuk.

Saya menggunakan:

netstat -nlp|grep 9000

untuk melihat apakah port tersebut ada dan saya mendapatkan ini:

   tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN

Tetapi bagaimana saya bisa mendapatkan PID dari proses yang menahannya?

wuchang
sumber
netstatperintah mungkin bekerja di banyak sistem operasi untuk memungkinkan Anda mendapatkannya, Anda hanya perlu menemukan argumen yang akan memastikan itu akan menunjukkan pids di sepanjang setiap port yang dikenal terbuka.
Luciano

Jawaban:

474

Di Linux, Anda harus menjadi root atau pemilik proses untuk mendapatkan informasi yang Anda inginkan. Dengan demikian, untuk proses yang berjalan sebagai pengguna lain, prapembuatan sudoadalah yang paling Anda butuhkan. Selain itu, pada sistem Linux modern, ssadalah alat yang digunakan untuk melakukan ini:

$ sudo ss -lptn 'sport = :80'
State   Local Address:Port  Peer Address:Port              
LISTEN  127.0.0.1:80        *:*                users:(("nginx",pid=125004,fd=12))
LISTEN  ::1:80              :::*               users:(("nginx",pid=125004,fd=11))

Anda juga dapat menggunakan doa yang sama dengan yang Anda gunakan saat ini, tetapi ingat untuk sudo:

$ sudo netstat -nlp | grep :80
tcp  0  0  0.0.0.0:80  0.0.0.0:*  LISTEN  125004/nginx

Anda juga dapat menggunakan lsof:

$ sudo lsof -n -i :80 | grep LISTEN
nginx   125004 nginx    3u  IPv4   6645      0t0  TCP 0.0.0.0:80 (LISTEN)
Chris Down
sumber
36
Catatan: di bawah OSX, -popsinya adalah untuk protokol daripada proses. Lihat pertanyaan ini
Bryan P
3
@BryanP OP meminta Ubuntu jadi itu agak tidak relevan ...
Adam B
43
@ AdamB Kecuali seorang pengguna Mac tiba di sini mencariFinding the PID of the process using a specific port
mraaroncruz
2
Jawaban ini mungkin akan ditingkatkan dengan menempatkan kebutuhan sudodi atas.
Nacht
2
@MrOnyancha Gunakan opsi terse (-t) -lsof -ti tcp:80
Mohnish
138

Anda juga dapat menggunakan lsofutilitas. Perlu di-root.

# lsof -i :25
COMMAND  PID        USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
exim4   2799 Debian-exim    3u  IPv4   6645      0t0  TCP localhost:smtp (LISTEN)
exim4   2799 Debian-exim    4u  IPv6   6646      0t0  TCP localhost:smtp (LISTEN)
Vitaliy
sumber
9
Perintah ini juga akan memberi Anda proses dengan establishedkoneksi, bukan hanya proses yang ada listening.
firelynx
1
Belum tentu menjadi root. Dan, bagi mereka yang ingin mendapatkan PID saja, Anda bisa lsof -i :25 -Fp, yang menghasilkan output seperti p1234.
Robert
12

Saya menggunakan "CentOS 7 minimal" yang tidak memiliki netstatkeduanya lsof. Tetapi banyak distribusi linux memiliki perintah statistik socket (yaitu ss).

Berikut ini contoh eksekusi:

# ss -tanp | grep 6379
LISTEN   0    128  127.0.0.1:6379   *:*   users:(("redis-server",pid=2531,fd=4))
Alexandr
sumber
1
Lihat jugass -pntl 'sport = :6379'
Stéphane Chazelas
10

Menjalankan perintah dengan sudoakan memberi Anda PID. Di mesin pengembangan saya, saya mendapatkan:

$ netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      -

$ sudo netstat -nlp | grep 8080
tcp6       0      0 :::8080      :::*       LISTEN      16449/java

Dan seperti yang disebutkan dalam jawaban lain Anda juga dapat menggunakan perintah ssatau lsof.

isapir
sumber
menjalankan perintah sebagai sudoID proses tampilan
Eugen Konkov
Tetapi bagaimana jika sudo netstat -nlp | grep 34157masih menampilkan -bukan PID?
Eugen Konkov
8

Anda juga dapat menggunakan fuser:

fuser -v -n tcp 22

Hasil :

                     USER        PID ACCESS COMMAND
22/tcp:              root        598 F.... sshd
GAD3R
sumber
Ini tidak berfungsi fuser -v -n tcp 80 , bahkan saya coba dengan sudo
SuperKrish
1
Catatan: Ini mengharuskan sudojika proses pelanggaran juga dimulai dengansudo
laggingreflex
1
Ini adalah hal yang baik untuk diingat secara umum. Perintah di Linux umumnya tidak akan memberikan informasi tentang proses yang dimulai oleh root / sudo kecuali perintah dijalankan dengan Sudo. Ini benar bahkan ketika perintah biasanya tidak perlu sudo untuk berjalan dengan benar.
njfife