스크립트 아래에서 실행 중입니다.
#!/bin/bash
ps ax | grep -q [v]arnish
if [ $? -eq 0 ];then
echo varnish is running...
exit 0
else
echo "Critical : varnish is not running "
exit 2
fi
출력은 다음과 같습니다 ::
[root@server ~]# sh -x check_varnish_pro.sh
+ ps ax
+ grep -q '[v]arnish'
+ '[' 0 -eq 0 ']'
+ echo varnish is running...
varnish is running...
+ exit 0
명령 줄에서 동일하게 실행하면 종료 상태가 1로 표시됩니다.
[root@server ~]# ps ax | grep -q [v]arnish; echo $?
1
서버에 니스가 설치되어 있지 않은 경우입니다. 이 스크립트는 니스가 설치된 서버에서 제대로 작동합니다.
스크립트와 명령 줄을 사용하여 실행할 때 종료 상태가 다른 이유는 무엇입니까? 이 스크립트를 개선하는 방법?
답변
check_varnish_pro.sh
test 라는 스크립트를 실행할 때
ps ax | grep -q [v]arnish
check_
varnish 라는 스크립트가 _pro
실행 중이므로 성공 합니다.
답변
일반적으로, 함께 간단한 접근법을 시도하는 나쁜 생각 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
프로세스) 의 패턴이 적중됩니다 .
답변
@AlexP 는 실제로 어떤 일이 일어나고 있는지 간결하게 설명 하지만 중요한 프로세스에 / 를 사용하는pgrep
pkill
@Kusalananda의 아이디어 는 강력히 권장되지 않습니다 . 더 나은 솔루션은 다음과 같습니다.
- 서비스 가 실행 중인지 묻습니다 .
systemctl status varnishd
현대적인 * nix 설치에서주의해야합니다. -
불행한 상황에서 서비스를 사용할 수없는 경우 프로세스가 종료되는 즉시 시작 스크립트를 변경하여 문제를보고 할 수 있습니다.
varnish || true some_command_to_send_an_alert_that_the_service_has_died
- 또는 서비스를 시작하는 스크립트를 변경하여 PID 를 기록한 다음로 주기적으로 상태를 확인하십시오
kill -0 "$pid"
.