如何检查特定的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 

它检查属于开放networking端口的所有进程ID,检查它是否是一个tomcat实例“activemq”。

有更好的build议吗?

 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.* ”的进程的pid,然后检查其打开的端口:

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

如果您需要:您可以添加uniqfilter:

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

根据JOE的评论编辑:

Joe Nazz写道:

它不起作用。 “”“$(ps aux | awk'/ [a] ctivemq / {print $ 2}'| sort -u)”“”的结果是多行,grep无法识别。 它来“没有这样的文件或目录…”

你是对的,如果有几个进程,我们需要在grep的正则expression式中多做一点工作。

所以为了保留我的run-netstat-just-once命令,expression式应该类似于:

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

该命令创build一个正则expression式来匹配每个Apache的pid(我使用apache2作为多实例进程来满足您的需求)。 正如你将在下面的expression式中看到的那样,创build的正则expression式会尝试匹配apache的每个pid:

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

– Joe Nazz写道:

[…]括号内的单词“a”是什么意思? –

关于为什么我在正则expression式中使用了[a]的问题,避免使用正则expression式创build的进程匹配是一个非常古老的技巧。 下面的例子是自我解释的:

 ~# 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:如果您觉得这个答案有帮助,请不要离开

这将检索“activemq”pid,testing返回一个,运行netstat一次。

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