bash 스크립트에서 가변 인수를 사용하여 정확한 프로세스 이름을 grep하세요.

bash 스크립트에서 가변 인수를 사용하여 정확한 프로세스 이름을 grep하세요.

프로세스 이름을 검색하려는 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 ffmpegffmpeg 프로세스(올바른)와 grepand 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 또는 스크립트와 일치하지 않습니다.

관련 정보