Ответ 1
Try
ps -p $(lsof -ti tcp:80) o comm=,pid=
или
netstat -tlnp | awk '/:80 */ {split($NF,a,"/"); print a[2],a[1]}'
Я пытаюсь определить, какое приложение использует определенный порт, и получить 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.
Каков наилучший способ сделать это?
Спасибо.
Try
ps -p $(lsof -ti tcp:80) o comm=,pid=
или
netstat -tlnp | awk '/:80 */ {split($NF,a,"/"); print a[2],a[1]}'
(Отвлекаясь от исходного вопроса), чтобы узнать, какой процесс прослушивает определенный номер порта, я обычно использую команду lsof
. Например:
lsof -i tcp:80
Чтобы отобразить только имя процесса и PID, проанализируйте вывод, используя:
lsof | tail -n +2 | awk '{print $1 " " $2}'
Команда tail
пропускает выходной заголовок, а awk
выводит нужные столбцы.
lsof
Попытка grep
вывод netstat
может быть беспорядочным, поскольку вам нужно убедиться, что вы соответствуете правильному столбцу. Мощное решение может быть довольно длинным и сложным (для меня в любом случае) производить по требованию.
lsof
избавляет вас от необходимости согласовывать правильные порты и имеет множество других применений, например. обратное к тому, что мы делаем сейчас (узнаем, какие порты используются процессом), или определяя, какой процесс использует точку файла/монтирования (или обратную). Подробнее см. lsof manpage.
awk + sed:
awk '{print $7}' | sed "s/\// /g"
... | awk '{print $7;}'| sed 's/\// /g'
Также вы можете избавиться от этого сообщения "вы должны быть root", перенаправляя stderr в /dev/null
netstat -tlnp 2>/dev/null | grep ...
netstat -tlnp 2>/dev/null | awk '/\.[0-9]:X/ {print $7}' | sed 's/\//\s/g'
где X в бит awk - порт, на который вы смотрите.
Попробуйте netstat -p
-p, --program Показать PID и имя программы, к которой принадлежит каждый сокет.