2015-10-13 3 views
2

У меня есть простой сценарий bash, который, как предполагается, должен контролировать, если mysql находится вверх или вниз. Если он не работает, я хочу также остановить запуск HAProxy. Ниже приведен мой простой сценарий bash:Linux bash script действующий weird

#!/bin/bash 

nc -z 127.0.0.1 3306 
rt_val=$? 
msg=$(sudo service haproxy stop); 
if [ $rt_val != 0 ]; then 
    eval $msg 
    exit 3 
else 
    exit 0 
fi 

Работающая или не работающая часть MySQL работает нормально. Это прекрасная часть HAProxy, которая, похоже, имеет проблему. Случается, что HAProxy останавливается, когда mysql останавливается. Но когда я запускаю MySQL и HAProxy, похоже, что скрипт продолжает останавливать HAProxy, даже если MySQL запущен и работает.

ответ

7

В вашем сценарии, вы безусловно выполнения sudo service haproxy stop и хранения выходного сигнала в $msg с помощью подстановки команд.

Вы можете сохранить команду в переменной, но это считается очень плохой практикой (см. Bash FAQ 050). Вместо этого попробуйте назначить команду функции и назвав его позже (function ключевого слова является необязательным и Bash конкретным, оставьте его для переносимости):

#!/bin/bash 

function stopcmd() { sudo service haproxy stop ; } # semicolon needed if on single line 

nc -z 127.0.0.1 3306 
rt_val=$? 

if [ $rt_val != 0 ]; then 
    stopcmd 
    exit 3 
else 
    exit 0 
fi 

Кроме того, ни функции, ни тест ([ ... ]) действительно необходимо в этом простом случае. Ваш скрипт может быть записан как:

#!/bin/bash 

if nc -z 127.0.0.1 3306 
then 
    exit 0 
else 
    sudo service haproxy stop 
    exit 3 
fi 
+0

Рекомендация по хранению команды в строке - не очень хорошая идея. Функция или массив ** намного лучше и надежнее. См. [Bash FAQ 050] (http://mywiki.wooledge.org/BashFAQ/050) для получения дополнительной информации об этой проблеме. (Он работает для этого простого случая, но не подходит для более сложных, поэтому лучше всего всегда избегать его.) –

+0

@EtanReisner: Да, конечно. Я попытаюсь переделать. –

+0

Спасибо, Майкл. Использование функции работает. Код второй части на самом деле этого не делает. –

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