Как узнать, какие порты прослушиваются определенным PID?


13

У меня есть PID определенного процесса, который прослушивает некоторые порты на моей OS X, и мне нужно знать, какой порт (ы) прослушивается этим процессом. Как мне это сделать?

Я знаю, что могу использовать, lsofчтобы узнать, какой процесс прослушивает какой-либо порт, но мне нужно выполнить обратную операцию.

Спасибо.

UPD

OS X использует утилиты BSD, поэтому у меня BSD, а netstatне Linux netstat. В Linux netstatесть -pвозможность показывать PID, BSD netstatиспользует -pдля указания порта и не имеет возможности показывать PID.


Вы хотите сказать, что пытаетесь найти порты, которые слушает процесс? netstatмогу сделать это для вас. Вы можете grepиспользовать PID, если хотите отфильтровать выходные данныеnetstat
— Centimane

также lsofиспользование не только один способ. вы можете сделать что - то подобное lsof|grep ${PID}. который будет грубо сбрасывать все и grepбудет выбирать строки с PID в них.
— Вне всякого сомнения

@ Дэйв, да, ты точно следуешь за мной. Как видно, версия BSD netstatне может отображать PID.
— Шау-котэ

@MelBurslan это не похоже на аккуратное решение. Кроме того, это не быстро - это занимает некоторое время на моем MBP.
— Шау-котэ

Ответы:


13

Я нашел решение самостоятельно путем глубокого прочтения man lsof. (Да, RT * M все еще помогает.) Спасибо @Gilles за прицеливание.

Вот решение: lsof -aPi -p 555 (555 - PID).

Объяснение:

  1. -p указать номер PID;
  2. -i отображать только сетевые устройства;
  3. -a И два условия выше (в противном случае они будут ИЛИ);
  4. -P для отображения номеров портов (вместо имен портов по умолчанию).

Кроме того, можно использовать lsof -aPi4 -p 555или lsof -aPi6 -p 55для адресов IPv4 или IP6 только соответственно.

Если выходные данные будут проанализированы другой -Fnопцией программы, это может быть полезно. С этой опцией lsofбудет производиться «вывод для другой программы» вместо хорошего форматированного вывода. lsof -aPi4 -Fn -p 555выведет что-то вроде этого:

p554
nlocalhost:4321

PS Все это я тестировал на своей OS X El Capitan, но, как я вижу, это должно работать и на Linux.


6

lsofпредоставляет информацию о файлах, открытых процессами, включая сетевые порты. Он доступен практически во всех системах Unix, включая OSX .

Rosetta Stone для Unix не перечислить любой другой инструмент для «процесса матча к файлу или порту» на OSX.

Чтобы вывести список процессов, прослушивающих порт TCP, вы можете использовать

lsof -iTCP -sTCP:LISTEN

lsof -iUDPвыводит список процессов с открытым сокетом UDP. lsof -iперечисляет все открытые сетевые сокеты (клиенты TCP, серверы TCP и другие протоколы IP).


0

если вы хотите узнать, какой порт слушает, вы можете использовать опцию netstat -p. Вы должны быть суперпользователем:

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

если вы хотите узнать больше об этом попробуйте эту ссылку


Речь идет о GNU netstat, у меня OS X и поэтому я использую BSD netstat. Он использует -pдля указания порта TCP / IP, и он не имеет возможности отображать PID.
— Шау-котэ

0

На FreeBSD вы можете использовать sockstatэту информацию. Я не уверен, есть ли у OS X sockstat, так как у меня нет Mac.

Например, чтобы увидеть все соединения TCPv4:

sockstat -4


Нет, sockstatна моем Mac нет команды. :(
— Шау-котэ

0

Вы можете объединить netstat с помощью grep, awk и sed, чтобы показать порты с соответствующими им pids в Linux и Cygwin:

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

Подробнее

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.