Bagaimana cara mengetahui port mana yang didengarkan oleh PID tertentu?

13

Saya memiliki PID proses tertentu mendengarkan beberapa port pada OS X saya dan saya perlu tahu port mana yang didengarkan oleh proses ini. Bagaimana saya bisa melakukannya?

Saya tahu saya dapat menggunakan lsofuntuk mengetahui proses mana yang mendengarkan beberapa port, tetapi saya perlu melakukan operasi terbalik.

Terima kasih.

UPD

OS X menggunakan utils BSD, jadi saya punya BSD netstatbukan Linux netstat. Linux netstatmemiliki -popsi untuk menampilkan PID, BSD netstatmenggunakan -puntuk menentukan port dan tidak memiliki opsi untuk menampilkan PID.

shau-kote
sumber
Apakah Anda bermaksud mengatakan bahwa Anda mencoba menemukan port yang sedang didengarkan? netstatdapat melakukan ini untuk Anda. Anda dapat grepmenggunakan PID jika Anda ingin memfilter output darinetstat
Centimane
juga lsofpenggunaannya tidak hanya satu arah. Anda dapat melakukan sesuatu seperti lsof|grep ${PID}. yang akan membuang semuanya dengan kasar dan grepakan memilih garis dengan PID di dalamnya. Dalam kesempatan off, mungkin daftar garis yang tidak relevan, karena nomor PID keliru mencocokkan beberapa nilai lain tetapi kemungkinannya tipis untuk tidak ada
MelBurslan
@Dave, ya, Anda mengikuti saya dengan benar. Alack, seperti yang saya lihat, versi BSD netstattidak dapat menampilkan PID.
shau-kote
@MelBurslan sepertinya itu bukan solusi yang rapi. Selain itu tidak cepat - butuh beberapa saat di MBP saya.
shau-kote

Jawaban:

13

Saya telah menemukan solusi sendiri dengan membaca dalam-dalam man lsof. (Ya, RT * M masih membantu.) Terima kasih @Gilles untuk membidik.

Inilah solusinya: lsof -aPi -p 555 (555 adalah PID).

Penjelasan:

  1. -p untuk menentukan nomor PID;
  2. -i untuk hanya menampilkan perangkat jaringan;
  3. -a ke DAN dua kondisi di atas (jika tidak mereka akan ORed);
  4. -P untuk menampilkan nomor port (bukan nama port secara default).

Selain itu, seseorang dapat menggunakan lsof -aPi4 -p 555atau hanya lsof -aPi6 -p 55untuk alamat IPv4 atau IP6.

Jika output akan diuraikan oleh -Fnopsi program lain mungkin dapat membantu. Dengan opsi ini lsofakan menghasilkan "output untuk program lain" bukannya output yang diformat bagus. lsof -aPi4 -Fn -p 555akan menampilkan sesuatu seperti ini:

p554
nlocalhost:4321

PS Semua itu saya sudah diuji pada OS X El Capitan saya, tetapi seperti yang saya lihat itu harus bekerja di Linux juga.

shau-kote
sumber
6

lsofmemberikan informasi tentang file yang dibuka oleh proses, termasuk port jaringan. Ini tersedia di hampir semua sistem unix, termasuk OSX .

The Rosetta Stone untuk Unix tidak mencantumkan alat lainnya untuk “proses pertandingan ke file atau port” di OSX.

Untuk daftar proses mendengarkan pada port TCP, Anda dapat menggunakan

lsof -iTCP -sTCP:LISTEN

lsof -iUDPdaftar proses yang memiliki soket UDP terbuka. lsof -imendaftar semua soket jaringan yang terbuka (klien TCP, server TCP, dan protokol IP lainnya).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
0

jika Anda ingin tahu port mana yang sedang mendengarkan Anda dapat menggunakan opsi -p netstat. Anda harus menjadi superuser:

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

jika Anda ingin tahu lebih banyak tentang hal ini, coba tautan ini

Vinood NK Maheshwari
sumber
Ini tentang GNU netstat, saya memiliki OS X dan karenanya menggunakan BSD netstat. Ini digunakan -puntuk menentukan port TCP / IP, dan tidak memiliki opsi untuk menampilkan PID.
shau-kote
0

Di FreeBSD, Anda dapat menggunakan sockstatinformasi ini. Saya tidak yakin apakah OS X punya sockstat, karena saya tidak punya Mac.

Misalnya, untuk melihat semua koneksi TCPv4:

sockstat -4

GROND
sumber
Alack, tidak ada sockstatperintah di Mac saya. :(
shau-kote
0

Anda dapat menggabungkan netstat dengan grep, awk dan sed untuk menampilkan port dengan pids yang sesuai di Linux & Cygwin:

$ netstat -ano | grep LISTENING | grep -v ‘\[::\]’ | sort -n | uniq -c | awk ‘ {print $3 “\t” $6}’ | sed ‘s/.*://’

Keterangan lebih lanjut

Atelier Iris
sumber