Назад | Перейти на главную страницу

Как проверить открытые порты конкретного экземпляра 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».

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

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

pids=`ps -eo 'pid,args' | awk '/activemq/ && !/awk/ {print $1}'`
test -n "${pids}" && netstat -lp | egrep -w "(`echo ${pids} | tr ' ' '|'`)"

Этот будет немного короче; он проверяет идентификаторы процессов с именем ".*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 не может распознать. Приходит "Нет такого файла или каталога ..." -

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

Итак, чтобы сохранить мою запустить 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: если вы считаете, что этот ответ был полезен, пожалуйста, не оставляйте без голосования

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 многократно.