현재 실행 중인 Java 프로세스의 요약을 출력하고 싶습니다. 내가 관심 있는 필드는 PID, 시작 시간, 최소 힙, 최대 도움말 및 애플리케이션 이름입니다. PID와 시작 시간은 항상 같은 위치에 있으므로 awk가 제대로 작동합니다. 그러나 JVM을 시작하는 데 사용되는 매개변수에 따라 최소 힙(-Xms로 시작하고 m으로 끝남), 최대 힙(-Xmx로 시작하고 m으로 끝남) 및 JVM에서 수집할 수 있는 애플리케이션 이름은 다음과 같습니다. -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를 사용하여 -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