init 스크립트를 속여 0을 반환하는 방법

init 스크립트를 속여 0을 반환하는 방법

다음을 따르지 않기 때문에 잘못 설계된 init 스크립트가 있습니다.Linux 표준 기본사양

다음 명령은 실행 중인 경우 종료 코드 0, 실행되지 않는 경우 3을 가져야 합니다.

service foo status; echo $? 

그러나 스크립트 설계 방식으로 인해 항상 0을 반환합니다. 대대적인 재작성 없이는 스크립트를 고칠 수 없습니다(서비스 foo 재시작은 서비스 foo 상태에 따라 달라지기 때문입니다).

service foo status실행 중일 때 0을 반환하고 실행 중이 아닐 때 3을 반환 하도록 이 문제를 어떻게 수정합니까 ?

내가 지금까지 가지고 있는 것:

root@foo:/vagrant# service foo start
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l
1
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l;echo $?
0 # <looks good so far

root@foo:/vagrant# service foo stop
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l
0
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l;echo $?
0 # <I need this to be a 3, not a 0

답변1

grep출력을 파이프하면 종료 코드 wc가 아닌 반환됩니다 .echo $?wcgrep

-q다음 옵션을 사용하면 이 문제를 쉽게 피할 수 있습니다 grep.

/etc/init.d/foo status | /bin/grep -q "up and running"; echo $?

필요한 문자열을 찾을 수 없으면 grep0이 아닌 종료 코드가 반환됩니다.

편집 : 제안한대로스프라틱 씨,다음과 같이 말할 수 있습니다.

/etc/init.d/foo status | /bin/grep -q "up and running" || (exit 3); echo $?

3문자열을 찾을 수 없으면 종료 코드가 반환됩니다.

man grep말할 것이다:

   -q, --quiet, --silent
          Quiet;  do  not  write  anything  to  standard   output.    Exit
          immediately  with  zero status if any match is found, even if an
          error was detected.  Also see the -s  or  --no-messages  option.
          (-q is specified by POSIX.)

관련 정보