У меня есть сценарий инициализации, который плохо разработан, поскольку он не соответствуетСтандартные базовые спецификации 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
возвращается ненулевой код выхода.
EDIT: Как и предложилг-н.spuratic, ты мог бы сказать:
/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.)