프로세스 이름을 검색하려는 bash 스크립트를 작성 중입니다. 이 이름은 스크립트를 실행할 때 사용되는 매개변수입니다.
ps -ef | grep [w]ord
일반적으로 흐름을 올바르게 만들기 위해 이렇게 할 수 있습니다 . grep(here)에 대한 인수가 [w]ord
다음과 같을 때$1
예:
ps -ef | grep [f]fmpeg
다음과 같은 줄이 표시됩니다. 그게 전부입니다.
jan 117977 117966 0 20:07 pts/0 00:00:01 ffmpeg ..
스크립트에서 동일한 동작을 원하고 스크립트에서 매개변수를 grep 매개변수로 설정하는 경우:
ps -ef | grep "$1"
이것을 호출하면 ./script.sh ffmpeg
ffmpeg 프로세스(올바른)와 grep
and bash
프로세스가 표시됩니다.
jan 117977 117966 0 20:07 pts/0 00:00:01 ffmpeg ..
jan 118566 117021 0 20:14 pts/4 00:00:00 bash ./script.sh ffmpeg
jan 118568 118566 0 20:14 pts/4 00:00:00 grep ffmpeg
출력의 마지막 두 줄에는 관심이 없습니다.
답변1
그냥 실행하세요:
pgrep -fl script.sh
에서 man pgrep
:
pgrep, pkill, pidwait - 이름 및 기타 속성을 기반으로 프로세스를 찾고, 신호를 보내고, 대기합니다.
-f
패턴--full
은 일반적으로 프로세스 이름과만 일치합니다. -f를 설정하면 전체 명령줄이 사용됩니다.
-l
,--list-name
프로세스 이름과 프로세스 ID를 나열합니다. (pgrep에만 해당됩니다.)
답변2
이를 지원하는 쉘에서는 하위 문자열 확장을 사용하여 대괄호를 올바른 위치에 배치할 수 있습니다.
name=ffmpeg
ps -ef | grep "[${name:0:1}]${name:1}"
grep "[f]fmpeg"
파이프의 오른쪽에서 실행됩니다.
(대부분의 특수 문자는 일반적으로 괄호 안의 특수 문자가 아니기 때문에 상대적으로 안전하지만 문자 이외의 다른 문자는 기대하지 않습니다.)
그래도 pgrep
자동으로 자신을 무시하는 방법을 알고 있기 때문에 더 좋습니다. 모든 내용을 인쇄하지는 않지만 ps
다음과 같은 내용이 도움이 될 수 있습니다.
name=ffmpeg
ps -f -p $(pgrep "$name" |tr '\n' ',')
답변3
grep의 역 매칭이 작동합니까?
grep -v 'grep\|script'
이는 grep 또는 스크립트와 일치하지 않습니다.