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