ps에 대해 다른 종료 상태를 얻는 이유 | 스크립트에서 grep?


11

스크립트 아래에서 실행 중입니다.

#!/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

서버에 니스가 설치되어 있지 않은 경우입니다. 이 스크립트는 니스가 설치된 서버에서 제대로 작동합니다.

스크립트와 명령 줄을 사용하여 실행할 때 종료 상태가 다른 이유는 무엇입니까? 이 스크립트를 개선하는 방법?


이런 종류의 해커가 아닌 실제 프로세스 감독 시스템을 사용하십시오. 운영 체제에는 거의 항상 내장 된 데몬이 시작시, 데몬 도구, 시스템화, 실행 또는 기타 여러 가지 대안 중 하나 인 실패시 자동으로 다시 시작되도록하는 기본 제공 방법이 있습니다. 그들 모두 는 이런 종류의 수동 해커보다 더 강력하고 능력이 있습니다.
Charles Duffy

답변:


10

check_varnish_pro.shtest 라는 스크립트를 실행할 때

ps ax  | grep -q [v]arnish

check_varnish 라는 스크립트가 _pro실행 중이므로 성공 합니다.


14

일반적으로, 함께 간단한 접근법을 시도하는 나쁜 생각 psgrep주어진 프로세스가 실행되고 있는지 확인하려고.

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프로세스) 의 패턴이 적중됩니다 .


4
모든 것이 "리눅스 땅에있는"파일이기 때문입니다.
zee

@ z_- 어떻게 연결되어 있는지 확실하지 않지만 Linux 이외의 Unices에서도 마찬가지입니다.
Kusalananda

4
grep 프로세스뿐만 아니라; 명명 된 스크립트 check_varnish_pro.sh도 하나의 요인입니다.
TNW

@TNW 나는 처음에 그것을 발견하지 못했지만 당신은 옳습니다. 추가하겠습니다.
Kusalananda

3

@AlexP 는 실제로 어떤 일이 일어나고 있는지 간결하게 설명 하지만 중요한 프로세스에 / 사용하는pgreppkill @Kusalananda의 아이디어 강력히 권장되지 않습니다 . 더 나은 솔루션은 다음과 같습니다.

  • 서비스 가 실행 중인지 묻습니다 . systemctl status varnishd현대적인 * nix 설치에서주의해야합니다.
  • 불행한 상황에서 서비스를 사용할 수없는 경우 프로세스가 종료되는 즉시 시작 스크립트를 변경하여 문제를보고 할 수 있습니다.

    varnish || true
    some_command_to_send_an_alert_that_the_service_has_died
  • 또는 서비스를 시작하는 스크립트를 변경하여 PID기록한 다음로 주기적으로 상태를 확인하십시오 kill -0 "$pid".

나는 단지 문제의 쉘 스크립팅 측면을 다루고 있다고 동의한다. 참고 systemctl하지만 리눅스 (AFAIK)에 거의에만 사용할 수 있으며, 모든 현대적인 유닉스 계열 시스템에.
Kusalananda

원래 질문 에는 "linux"라는 태그가있었습니다. 왜 @muru에 의해 제거되었는지 확실하지 않습니다.
l0b0

고마워 l0b0. "왜"와 "개선 방법"이라는 두 가지 질문이있었습니다. @AlexP의 답변으로 첫 번째 질문이 해결되었으며 두 번째 질문에 대한 답변이 더 좋습니다. 그러나 Kusalananda는 이와 관련하여 비슷한 문제가있는 사람들에게 도움이 될 것이라고 생각합니다. 그래서 지금 대답으로 받아 들일 혼란이 있습니다.
prado 2012 년

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.