![bash 스크립트에서 pgrep을 올바르게 사용하는 방법은 무엇입니까?](https://linux55.com/image/58976/bash%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20pgrep%EC%9D%84%20%EC%98%AC%EB%B0%94%EB%A5%B4%EA%B2%8C%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
저는 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
대신에.