Как проверить открытые порты конкретного экземпляра tomcat java

На данный момент мне удалось сделать это с:

root@server:~# for i in $(netstat -lp | grep java | awk '{print $7}' | awk -F '/' '{print $1}' | sort | uniq); do ap=$(ps p $i | grep -v PID | grep activemq | awk '{print $1}'); done; netstat -lp | grep $ap
tcp        0      0 localhost:32000         *:*                     LISTEN      23059/java      
tcp6       0      0 HPM.DMZ:61616           [::]:*                  LISTEN      23059/java      
tcp6       0      0 [::]:8161               [::]:*                  LISTEN      23059/java      
tcp6       0      0 [::]:36168              [::]:*                  LISTEN      23059/java

Он проверяет все идентификаторы процессов, принадлежащие открытым сетевым портам, проверяет, является ли это экземпляром tomcat "activemq".

Есть лучшие предложения?

3 ответа

for i in $(ps aux | awk '/activemq/ {print $2}' | sort -gu); do netstat -lp | grep $i; done

tcp        0      0 localhost:32000         *:*                     LISTEN      23059/java      
tcp6       0      0 HPM.DMZ:61616           [::]:*                  LISTEN      23059/java      
tcp6       0      0 [::]:8161               [::]:*                  LISTEN      23059/java      
tcp6       0      0 [::]:36168              [::]:*                  LISTEN      23059/java

короче но называет netstat несколько раз.

Этот будет немного более кратким; он проверяет, какие пиды именуются процессами.*activemq.*и после этого проверяет их открытые порты:

netstat -lp | grep  $(ps aux | awk '/[a]ctivemq/ {print $2}')

Вы можете добавить фильтр uniq, если вам нужно:

netstat -lp | grep  $(ps aux | awk '/[a]ctivemq/ {print $2}' | sort -u)

ИЗДАНО НА ОСНОВЕ КОММЕНТАРИЙ ДЖО:

Джо Назз написал:

Не работает Результат """$(ps aux | awk '/[a]ctivemq/ {print $2}' | sort -u)""" - несколько строк, которые grep не может распознать. Бывает "Нет такого файла или реж..."

Вы правы. Если есть несколько процессов, нам нужно работать немного больше в выражении нашего регулярного выражения grep.

Поэтому, чтобы сохранить мою команду run-netstat-just-Once, выражение должно быть примерно таким:

~# netstat -lp | grep $(ps aux | awk '/[a]pache/ {a=a"\|"$2} END { sub(/^../,"",a); print "("a")"}')

Команда создает регулярное выражение для соответствия каждому pid apache (я использую apache2 как процесс с несколькими экземплярами, чтобы соответствовать вашим потребностям). Как вы увидите в следующем выражении, созданное регулярное выражение пытается соответствовать каждому pid apache:

~# ps aux | awk '/[a]pache/ {a=a"\|"$2} END { sub(/^../,"",a); print "("a")"}'
(7335\|7336\|7337\|7338\|7339\|8733\|8744\|13418\|13421\|23126)

- Джо Назз писал:

[...] Но что означает одиночное "а" в скобках? -

Что касается вашего вопроса, связанного с тем, почему я использовал [a] в регулярном выражении, это очень старый прием, чтобы избежать соответствия процессу, созданному самим регулярным выражением. Следующий пример говорит сам за себя:

~# ps aux | grep foo
root     10932  0.0  0.0   9608   868 pts/0    S+   11:42   0:00 grep foo
~# ps aux | grep "[f]oo"
~# 

PS: если вы считаете, что этот ответ был полезным, пожалуйста, не оставляйте без голосования

Это извлекает pid "activemq", проверяет, что один был возвращен, запускает netstat один раз.

pids=`ps -eo 'pid,args' | awk '/activemq/ && !/awk/ {print $1}'`
test -n "${pids}" && netstat -lp | egrep -w "(`echo ${pids} | tr ' ' '|'`)"
Другие вопросы по тегам