2016-10-13 3 views
-1

Я пытаюсь обнаружить запущенный сервис, и если нет, попробуйте сделать что-то:

#!/bin/bash 

service --status-all | grep 'My Service' &> /dev/null 

if [ $? -ne 0 ]; then 
    echo "Service not there." 
else 
    echo "Service is there." 
fi 

служба явно есть, но до сих пор я получаю «Служба не существует.»

Я прочитал о коде выхода $? Я думаю, может быть, код выхода из серии команд может повлиять на то, что мы хотим проверить?

Так что я не уверен, что пошло не так?

+2

0 означает успех, как и то, что происходит, когда Grep находит свой образец. Поэтому, возможно, ваше условное выражение перевернуто. – bishop

+1

Возможно, _Service_ написана с ошибкой в ​​'grep 'My Serivice'' (SerIvice)? –

+0

nah, имя верно, я пропустил его в этом вопросе, извините –

ответ

1

Для отладки, что происходит с вашим испытанием, запустить один шаг за один раз.

Сначала сделайте service --status-all сам и проверьте его выход. Является ли вывод тем, что вы ожидаете от него, и действительно ли он включает в себя «Мое обслуживание», для которого вы используете grepping?

Затем запустите service --status-all | grep 'My Service' и проверьте его код выхода и выхода. Выписывает ли он совпадение, и это код выхода 0?

man grep говорит нам, что:

The grep utility exits with one of the following values: 

0  One or more lines were selected. 
1  No lines were selected. 
>1 An error occurred. 

, а также

-q, --quiet, --silent 
     Quiet mode: suppress normal output. grep will only search a file until a 
     match has been found, making searches potentially less expensive. 

Есть также улучшения в этом процессе, что вы можете сделать ...

if проверяет статус возвращения из который выполняется, и если этот статус равен нулю, выполняется ветвь then. Зная это, вы можете просто проверить статус возврата grep вместо статуса возврата test.


в сторону:
Вы используете [ команду, которая также команда test (попробуйте man test)
The test команда выходит с 0, когда тест пройден (успешно), или 1, если тест терпит неудачу.

$ test 7 -eq 7;echo $? 
0 
$ test 7 -ne 7;echo $? 
1 
$ [ 7 -eq 2 ];echo $? 
1 

С этим знанием, опять же, вы можете непосредственно проверить код выхода Grep. Выход
Подавить Grep с «тихим» флагом вместо перенаправления, и использовать grep -F для фиксированных строк, который а.к.а. fgrep:

if ./service --status-all | fgrep -q 'My Servvice' 
then 
    echo "Service IS there." 
else 
    echo "Service NOT there." 
fi 
+0

благодарит @StephenP, шаги помогают узнать преступника. Для справки каждого, служба --status-works во время подсказки bash, похоже, ничего не возвращает во время моего развертывания AWS EC2. Я должен изменить его на что-то вроде ps ps | grep -v grep | grep -q «Моя служба» (я использовал -q вместо того, чтобы ссылаться на нулевое устройство, как вы упомянули), отсюда: http://www.akamaras.com/linux/linux-script-to-check-if-a -сервис-это-обкатка и стартер-это-если-его-остановлен / –

-3

Перенаправление стандартного вывода не должны иметь &

Попробуйте это:

#!/bin/bash 
service --status-all | grep "My Service" > /dev/null 2>&1 
if [ $? -ne 0 ] 
then 
    echo "Service not there." 
else 
    echo "Service is there." 
fi 
+1

Использование '>' перенаправляет 'stdout', а' 2> 'перенаправляет' stderr' ... но '&>' перенаправляет _both_, так что это совершенно верно. –

+2

'&> filename' является ярлыком bash для'> filename 2> & 1'. – Barmar

Смежные вопросы