Подтвердить что ты не робот

Как разбирать команду netstat, чтобы получить от нее имя процесса и PID?

Я пытаюсь определить, какое приложение использует определенный порт, и получить 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.

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

Спасибо.

4b9b3361

Ответ 1

Try

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

или

netstat -tlnp | awk '/:80 */ {split($NF,a,"/"); print a[2],a[1]}'

Ответ 2

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

lsof -i tcp:80

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

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

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

Почему lsof

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

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

Ответ 3

awk + sed:

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

Ответ 4

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

Ответ 5

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

netstat -tlnp 2>/dev/null | grep ...

Ответ 6

netstat -tlnp 2>/dev/null | awk '/\.[0-9]:X/ {print $7}' | sed 's/\//\s/g'

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

Ответ 7

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

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