Как разобрать команду netstat, чтобы получить из нее имя процесса и PID? - PullRequest
22 голосов
/ 22 ноября 2010

Я пытаюсь определить, какое приложение использует определенный порт, и получить netstat -tlnp | grep <port> for Linux.

Эта команда возвращает следующий вывод:

(Not all processes could be identified, non-owned process info will not be shown, you would have to be root to see it all.)  
tcp  0  0 0.0.0.0:<port>  0.0.0.0:*  LISTEN  3591/java

Мне нужно получить только результатназвание процесса и PID, т.е. java 3591.

Какой лучший способ сделать это?

Спасибо.

Ответы [ 7 ]

29 голосов
/ 23 ноября 2010

Попробуйте

ps -p $(lsof -ti tcp:80) o comm=,pid=

или

netstat -tlnp | awk '/:80 */ {split($NF,a,"/"); print a[2],a[1]}'
15 голосов
/ 22 ноября 2010

(немного отвлекаясь от вашего исходного вопроса), чтобы узнать, какой процесс прослушивает определенный номер порта, я обычно использую команду lsof. Например:

lsof -i tcp:80

Чтобы показать только имя процесса и PID, проанализируйте вывод, используя:

lsof | tail -n +2 | awk '{print $1 " " $2}'

Команда tail пропускает выходной заголовок, а awk печатает необходимые столбцы.

Почему lsof

Попытка grep вывода netstat может быть грязной, так как вам нужно убедиться, что вы сопоставляете с правильным столбцом. Надежное решение может быть довольно длинным и сложным (для меня в любом случае) для производства по требованию.

lsof избавляет вас от необходимости подбирать правильные порты, а также имеет множество других применений, например, обратное тому, что мы делаем сейчас (выясните, какие порты используются процессом), или определение того, какой процесс использует точку файла / монтирования (или обратную). См. lsof manpage для дополнительных примеров.

2 голосов
/ 22 ноября 2010

awk + sed:

awk '{print $7}' | sed "s/\// /g"
1 голос
/ 22 ноября 2010

Также вы можете избавиться от этого сообщения «вы должны быть пользователем root», перенаправив stderr в / dev / null

netstat -tlnp 2>/dev/null | grep ...
1 голос
/ 22 ноября 2010

... | awk '{print $7;}'| sed 's/\// /g'

0 голосов
/ 27 декабря 2013

Попробуйте netstat -p

-p, --program Показать PID и имя программы, которой принадлежит каждый сокет.

0 голосов
/ 22 ноября 2010
netstat -tlnp 2>/dev/null | awk '/\.[0-9]:X/ {print $7}' | sed 's/\//\s/g'

где X в бите awk - это порт, на который вы смотрите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...