초기화 스크립트를 속여 0을 반환하는 방법

초기화 스크립트를 속여 0을 반환하는 방법

나는 표준을 따르지 않기 때문에 제대로 설계되지 않은 초기화 스크립트를 가지고 있습니다.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

출력을 and grep로 파이프하고 and 에 대한 종료 코드를 반환합니다 .wcecho $?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.)

관련 정보