运行 JVM 的摘要报告

运行 JVM 的摘要报告

想要输出当前运行的 java 进程的摘要。我感兴趣的字段是 PID、开始时间、最小堆、最大帮助和应用程序名称。 PID 和开始时间始终处于同一位置,因此 awk 对它们来说运行良好。但是,根据用于启动 JVM 的参数,最小堆(以 -Xms 开头并以 m 结尾)、最大堆(以 -Xmx 开头并以 m 结尾)以及可以从字段开头收集的应用程序名称与 -Djboss.server.base 最终处于不同的位置,因此 awk 的位置编号不一致。这是适用于大多数流程的方法。我们如何改进它,以便它找到 ps 输出中的最小/最大堆和应用程序名称?

ps -ef |grep "D\[S" |awk '{printf "%5s %5s %9s %9s %-35s\n",$2, $5, $(NF-16), $(NF-15), $(NF-2)}' | \
sed 's/-Djboss.server.base.dir=\/usr\/share\/jboss-as\///g' |  sed 's/-standalone//g' | \
sort -k5 | tee /dev/stderr | wc -l | sed -e '$s/$/ JBoss JVMs running/'

预期产出

715456 11:13  -Xms512m  -Xmx512m app1  
721978 13:08  -Xms512m  -Xmx512m app2  
722824 13:16  -Xms128m  -Xmx128m app3  
562899 Feb15  -Xms512m  -Xmx512m app4  
655796 Feb16 -Xms1024m -Xmx1024m app5  
5 JBoss JVMs running  

但是,对于某些应用程序,堆大小的位置和 -Djboss.server.base 限定符不在指定位置。对于那些输出是不正确的。例如:

620378 Feb16 -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman app6   

正在运行的进程的示例。

jboss     653349  653268  0 Feb16 ?        00:00:39 java -D[Standalone] -server -verbose:gc -Xloggc:/usr/share/jboss-as/witr_standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1024m -Xmx1024m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman,com.sun.crypto.provider -Djava.awt.headless=true -Djboss.modules.policy-permissions=true -Dorg.jboss.boot.log.file=/usr/share/jboss-as/witr_standalone/log/server.log -Dlogging.configuration=file:/usr/share/jboss-as/witr_standalone/configuration/logging.properties -jar /usr/share/jboss-as/jboss-modules.jar -mp /usr/share/jboss-as/modules org.jboss.as.standalone -Djboss.home.dir=/usr/share/jboss-as -Djboss.server.base.dir=/usr/share/jboss-as/witr_standalone -c standalone.xml  

预期产出

653349 Feb16 -Xms1024m -Xmx1024m witr

答案1

使用 GNU sed for-E启用 ERE 和\s/\S简写[[:space:]]/[^[:space:]]

$ cat file | sed -E 's:\S+\s+(\S+)(\s+\S+){2}\s+(\S+).*(-Xms[0-9]+m).*(-Xmx[0-9]+m).*-Djboss\.server\.base\.dir[^ ]+/([^ ]+)_standalone.*:\1 \3 \4 \5 \6:'
653349 Feb16 -Xms1024m -Xmx1024m witr

显然,在上面我使用的cat file不仅仅是ps -ef使用您提供的示例输入进行测试:

$ cat file
jboss     653349  653268  0 Feb16 ?        00:00:39 java -D[Standalone] -server -verbose:gc -Xloggc:/usr/share/jboss-as/witr_standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1024m -Xmx1024m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman,com.sun.crypto.provider -Djava.awt.headless=true -Djboss.modules.policy-permissions=true -Dorg.jboss.boot.log.file=/usr/share/jboss-as/witr_standalone/log/server.log -Dlogging.configuration=file:/usr/share/jboss-as/witr_standalone/configuration/logging.properties -jar /usr/share/jboss-as/jboss-modules.jar -mp /usr/share/jboss-as/modules org.jboss.as.standalone -Djboss.home.dir=/usr/share/jboss-as -Djboss.server.base.dir=/usr/share/jboss-as/witr_standalone -c standalone.xml

相关内容