На данный момент мне удалось это сделать с помощью:
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 многократно.