스크립트를 작성하여 변수로 사용하고 있습니다.
RESULT1=`ps -ef | grep -w "PHANTOM PHA-WRM-EXPIRE"`.
ps
두 개의 PID가 나열 됩니다 .
[xhobando@noitu TNOITU]$ ps -ef | grep -w "/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE"
phantomxg 7250 1 0 12:15 ? 00:00:01 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE
phantomxg 17071 1 0 Oct04 ? 00:05:27 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE
여기서 달성하고 싶은 것은 grep
옵션이 둘 다 아닌 첫 번째 PID만 찾는다는 것입니다.
이것이 의미가 있는지 알려주세요.
답변1
PCRE 지원과 함께 GNU 사용 grep
(rhel에서 구현):
ps -Ao pid= -o args= |
grep -Pom1 '^\s*\K\d+(?= \Q/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE\E)'
어디
-P
P
erl과 유사한 정규식 으로 전환합니다 (\s
,\K
,\d
,(?=...)
,\Q
,\E
모든 Perl과 유사한 확장의 경우).-o
grep
일치하는 부분만 출력하도록 지시합니다 .-m1
grep
일치하는 첫 번째 줄만 출력하도록 지시합니다 .
(세 가지 플래그는 모두 GNU 확장이지만 GNU는 RHEL에서 발견된 구현 grep
입니다 .)grep
ps -f
신경 쓰지 않는 일부 필드를 인쇄하는 대신 필요한 필드만 선택하고( 접미사 pid
는 헤더를 제거하는 것임) 명령줄에서 더 쉽게 일치시킬 수 있습니다.args
=
여기서 정규식은 ^
0개 이상의 ( *
) 공백 문자 ( ) 로 구성된 일련의 선행 ( )을 찾은 다음 일치의 시작을 표시하고 ( ), 그 뒤에 \s
1개 이상의 ( ) 숫자로 \K
구성된 시퀀스 ( )를 찾습니다. 시퀀스 뒤에는 공백과 원하는 인수(정규식 연산자 목록을 포함할 수 있는 다른 인수로 대체하기 쉽도록...로 인용)가 따라옵니다(일치의 일부가 아닌 미리보기 연산자).+
\d
(?=...)
\Q
\E
아니면 그냥 사용하세요 pgrep
:
pgrep -f '^/usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE' | head -n 1
인수 목록(공백 문자로 연결됨)이 로 시작하는 첫 번째 프로세스의 pid를 반환합니다 /usr/ud/bin/udt PHANTOM PHA-WRM-EXPIRE
.
ps
프로세스는 또는 기본적으로 출력에서 pid를 기준으로 숫자순으로 정렬되며 pgrep
, pid 숫자는 최대값에 도달하면 줄 바꿈되므로 얻게 되는 숫자는 다소 무작위입니다.
--sort start_time
예 를 --sort -start_time
들어 ps
시작 시간별로 정렬하거나 -o
/를 추가할 수 있습니다.-n
가장 오래된/최신 정보및 pgrep
제거 | head -n 1
) 가장 최근에 시작된 프로세스임을 보장하는 대신 가장 빠른/최근에 시작된 프로세스를 얻으려는 경우처형된udt
첫 번째/마지막 프로세스는 수명 동안 여러 명령을 실행할 수 있으며 종종 실행합니다.
질문에 대한 귀하의 의견에서 알 수 있듯이 현재 작업 디렉토리를 기반으로 프로세스를 선택하려면 다음 zsh
방법을 사용할 수 있습니다.
pids=(
/proc/<1->(e[$'[[ $REPLY/cwd -ef /tdata/PHANTOM &&
$(<$REPLY/cmdline) = /usr/ud/bin/udt\0PHANTOM\0PHA-WRM-EXPIRE\0* ]]']:t)
)
여기에서 처음 3개의 인수로 /tdata/PHANTOM
, 및 가 있는 프로세스를 찾으세요 ./usr/ud/bin/udt
PHANTOM
PHA-WRM-EXPIRE
그러나 프로세스에 슈퍼유저 권한이 없으면 자신의 프로세스의 작업 디렉터리만 찾을 수 있습니다.