目前我已经设法做到这一点:
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 ' ' '|'`)"