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