ps 출력에서 ​​Tomcat 매개변수 추출

ps 출력에서 ​​Tomcat 매개변수 추출

저는 작은 진단 도구를 작성하려고 하는데 이 도구에서 실행하려는 기능 중 하나는 다음과 같습니다.

ps axu | grep tomcat | grep -v grep | awk '{ print $<list of desired fields> }'  

Tomcat을 시작한 사용자 ID와 Tomcat이 시작될 때 전달된 다음 매개변수를 반환하고 싶습니다.

-javaagent:/usr/share/tomcat7/<someagent> -Dcatalina.base=/var/lib/tomcat7 
- Dcatalina.home=/usr/share/tomcat7 -Djava.io.tmpdir=/tmp/tomcat7-tomcat7-tmp

이 필드를 배열로 전달하고 이를 사용자에게 Tomcat 설치에 대해 알리는 데 사용할 수 있습니다.

문제는 awk를 작동시키는 데 필요한 필드를 강제로 적용하기 위해 명령 형식을 지정하는 방법을 찾을 수 없다는 것입니다.

이 시점에서는 출력을 가져와서 임시 파일에 쓴 다음 정규식을 사용하여 원하는 것을 추출하려고 생각하고 있습니다.

Bash에서 이 작업을 수행할 수 있는 방법이 있다는 것을 알고 있지만 여기서는 성공적으로 도달하지 못했습니다.

답변1

출력할 필드를 제어 -o하려면 옵션을 전달하세요 . ps모든 필드 뒤에 기호를 추가하면 =헤더 행이 생략됩니다.

주장하는 -e대신 사용ax기준기능(이것은 골동품이 아닌 UNIX에 적용됩니다).

필터가 grep강력하지 않습니다. 예를 들어, 이름이 지정된 스크립트에서 이 명령을 실행하면 look-for-tomcat스크립트도 일치합니다. 이는 org.apache.catalina.startup.Bootstrap매개변수를 사용하여 JVM 프로세스를 찾는 보다 안정적인 방법입니다 .

ps -e -o user=,args= | awk '
    $2 ~ /java$/ &&  / org\.apache\.catalina\.startup\.Bootstrap($| ) {
        print "user name: ", $1;
        if (match($0, / -javaagent:[^ ]* /)) print substr($0, RSTART+1, RSTART+RLENGTH-2);
        # etc.
    }'

/var/run/tomcat.pid더 나은 접근 방식은 시작 시 Tomcat 프로세스의 PID를 파일에 기록하는 것입니다(예:).

답변2

*nix에 대한 자신만의 선호 사항이 있다면 /proc여기에서 원하는 데이터를 얻을 수 있습니다. 나는 이것이 인간이 읽을 수 있도록 지루한 구문 분석 출력을 헤쳐나가는 것보다 조금 더 제정신일 수 있다고 생각합니다.

tomcat예를 들어 프로세스를 시작한 사용자 ID를 얻으려면 다음을 수행할 수 있습니다.

stat -c'%u' /proc/$(pgrep tomcat)/

가용성(및 표준화)에 의존하는 것은 /proc특정 애플리케이션/환경/에 따라 더 문제가 될 수 있습니다. 결정하는 것은 귀하에게 달려 있습니다.

관련 정보