Как узнать, какие порты прослушиваются определенным 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.