다음을 따르지 않기 때문에 잘못 설계된 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 $?
wc
grep
-q
다음 옵션을 사용하면 이 문제를 쉽게 피할 수 있습니다 grep
.
/etc/init.d/foo status | /bin/grep -q "up and running"; echo $?
필요한 문자열을 찾을 수 없으면 grep
0이 아닌 종료 코드가 반환됩니다.
편집 : 제안한대로스프라틱 씨,다음과 같이 말할 수 있습니다.
/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.)