bash 스크립트에서 pgrep을 올바르게 사용하는 방법은 무엇입니까?

bash 스크립트에서 pgrep을 올바르게 사용하는 방법은 무엇입니까?

저는 GUI 프로그램을 실행하고 있습니다.열광(src에서 컴파일) 실행 파일에 스크립트(zeal.sh)를 추가합니다.

#!/bin/bash

if pgrep zeal &>/dev/null; then
    printf "already on\n"
else
    ~/tools/zeal/zeal/zeal &>/dev/null &
fi

이상한 점은 이 스크립트를 이와 같이 실행할 때 /path/to/zeal.sh항상 "이미 시작됨"이라는 메시지가 표시되는 반면, bash /path/to/zeal.sh이를 사용하면 프로세스가 실행 중인지 올바르게 판단한다는 것입니다.

또한 유사한 스크립트(예: Firefox)를 사용하여 다른 GUI 프로그램을 검사했는데 제대로 작동합니다.

그렇다면 이런 일이 어떻게 발생하며 어떻게 해결합니까?

답변1

Hauke의 답변에서 제안된 긴 옵션은 --exact일부 시스템에서는 작동하지 않습니다. 대신 동등한 짧은 옵션을 사용할 수 있습니다 -x.

#!/bin/bash

if pgrep -x "zeal" > /dev/null
then
    echo "Running"
else
    echo "Stopped"
fi

답변2

문제는 직접 호출이 스크립트 이름을 명령 이름으로 만든다는 것입니다.

cat /proc/$PID/comm

결과적으로 pgrep일치합니다. 를 통해 호출되는 경우 bash명령 이름은 "bash"입니다.

사용

pgrep --exact zeal

대신에.

관련 정보