일반적으로, 함께 간단한 접근법을 시도하는 나쁜 생각 ps
과 grep
주어진 프로세스가 실행되고 있는지 확인하려고.
pgrep
이것을 사용 하는 것이 훨씬 좋습니다 .
if pgrep "varnish" >/dev/null; then
echo "Varnish in running"
else
echo "Varnish is not running"
fi
에 대한 설명서를 참조하십시오 pgrep
. 일부 시스템 (아마도 Linux에서는 아님)에서는 로 리디렉션 할 필요가없는 -q
동일한 플래그에 해당 하는 플래그가 표시 grep
됩니다 /dev/null
. -f
프로세스 이름 만이 아니라 전체 명령 행에서 일치를 수행 하는 플래그 도 있습니다 . 를 사용하여 특정 사용자에게 속한 프로세스로 일치를 제한 할 수도 있습니다 -u
.
pgrep
또한 설치 pkill
하면 이름을 기반으로 프로세스에 신호를 보낼 수있는 액세스 권한이 부여 됩니다.
또한 이것이 서비스 데몬 이고 Unix 시스템에 정보를 요청하는 방법이있는 경우 (예 : 작동 여부) 적절한 확인 방법입니다.
리눅스에서, 당신은 systemctl
( systemctl is-active --quiet varnish
그것을 실행중인 경우 3, 그렇지 않으면 0을 반환), 당신이 오픈 BSD에 rcctl
등
이제 스크립트로 :
스크립트에서의 출력을 구문 분석합니다 ps ax
. 이 출력에는 스크립트 자체의 이름이 포함되며 여기에는 check_varnish_pro.sh
분명히 문자열이 포함 varnish
됩니다. 이것은 당신에게 오 탐지를 제공합니다. 테스트하는 동안 -q
플래그 없이 실행했다면 이것을 발견했을 것 grep
입니다.
#!/bin/bash
ps ax | grep '[v]arnish'
그것을 실행 :
$ ./check_varnish_pro.sh
31004 p1 SN+ 0:00.04 /bin/bash ./check_varnish_pro.sh
또 다른 문제는 패턴 을 사용하여 grep
프로세스 grep
자체 가 감지되지 않도록 "숨기려고"한다는 것 [v]
입니다. 파일이나 디렉토리에 이름이 지정된 디렉토리에서 스크립트 나 명령 행을 실행하면이 방법이 실패 varnish
합니다 (이 경우 오 탐지가 다시 발생 함). 패턴이 인용되지 않고 쉘이 파일 이름 지정을 수행하기 때문입니다.
보다:
bash-4.4$ set -x
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep '[v]arnish'
bash-4.4$ touch varnish
+ touch varnish
bash-4.4$ ps ax | grep [v]arnish
+ ps ax
+ grep varnish
91829 p2 SN+p 0:00.02 grep varnish
파일 varnish
이 있으면 셸 [v]arnish
이 파일 이름으로 바뀌고 varnish
프로세스 테이블 ( grep
프로세스) 의 패턴이 적중됩니다 .