bash-4.1$ ps -ef|grep component_events.xml
gdxx1122 1190 1181 0 Mar25 ? 00:00:00 /xx1122/fmw/product/111/ohs_111/ohs/bin/odl_rotatelogs -l -h:/xx1122/admin/xx1122_vmabcd123/config/OHS/ohs1/component_events.xml_ohs1
/xx1122/admin/xx1122_vmabcd123/auditlogs/OHS/ohs1/audit-pid1181-%Y%m%d%H%M%S.log 1M 4M
gdxx1122 19885 19205 0 08:05 pts/1 00:00:00 grep component_events.xml
위 명령어를 스크립트에서 실행하면 "/xx1122/admin/xx1122_vmabcd123/config/OHS/ohs1"이 추출되어 변수에 할당될 수 있습니다. 위 출력은 서버마다 다를 수 있으므로 동적이어야 합니다. 시작 문자열 xx1122는 동적으로 전달되어야 합니다.
답변1
POSIXly를 사용하세요 sed
:
var=$(
ps -Ao args= | sed -n 's|.* -h:\(.*\)/component_events\.xml.*|\1|p'
)
/component_events.xml
사실상 이는 마지막 발생과 그 이전의 마지막 발생 사이의 명령줄 부분을 반환합니다 -h:
.
따라서 명령줄이 다음과 같은 경우:
... -h:x/component_events.xml -g:y/component_events.xml
x/components_events.xml -g:y
당신은 대신 얻을 것이다 x
.
이를 방지하기 위해 이를 변경할 수 있지만 sed -n 's|.* -h:\([^ ]*\)/component_events\.xml.*|\1|p'
공백 문자가 포함된 디렉터리 이름에는 더 이상 작동하지 않습니다.
최신 GNU/Linux 시스템에서는 다음을 수행할 수도 있습니다:
LC_ALL=C grep -zhPo '^-h:\K.*(?=/component_events\.xml)' /proc/*/cmdline |
tr '\0' '\n'
이는 모든 디렉터리 이름에 적용됩니다.
답변2
pgrep
pid를 찾는 데 사용됩니다 /proc/$PID/cmdline
.
var=$(
pgrep -f "component_events.xml" | \
xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline | tr '\0' '\n'" | \
xargs -n1 dirname
)
이는 명령 경로에 매개변수가 있고 여러 PID가 발견된 경우에도 작동합니다.
설명하다:
검색 PID:
pgrep -f "component_events.xml"
발견된 각 PID에 대해 전체 명령( /proc/PID/cmdline
)을 가져오지만 인수( ) 없이 명령만 인쇄합니다 head -z -n1
.
xargs -I{} sh -c "head -z -n1 /proc/{}/cmdline
그런 다음 후행 \0
개행 문자( \n
)를 바꿉니다.
tr '\0' '\n'"
디렉토리 이름만 출력:
xargs -n1 dirname