저는 작은 진단 도구를 작성하려고 하는데 이 도구에서 실행하려는 기능 중 하나는 다음과 같습니다.
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
특정 애플리케이션/환경/에 따라 더 문제가 될 수 있습니다. 결정하는 것은 귀하에게 달려 있습니다.