BASH: проверьте на наличие ошибок перед проверкой условий - PullRequest
0 голосов
/ 02 марта 2012

Я пытаюсь написать простой скрипт Bash для мониторинга состояния репликации MySQL.Сценарий выглядит следующим образом:

#!/bin/bash
dbhost=192.168.1.2
repluser=root
replpasswd=password
echo "show slave status\G"|\
mysql -h $dbhost -u $repluser -p$replpasswd > tmpd 2>/dev/null
repl_IO=$(cat tmpd | grep "Slave_IO_Running" | cut -f2 -d':')
repl_SQL=$(cat tmpd | grep "Slave_SQL_Running" | cut -f2 -d':')
if [ $repl_IO != "Yes" -o $repl_SQL != "Yes" ] ; then
     echo
     echo -e "\033[31m Replication Error."
     echo -e "\033[0m"
     mail -s "replication error" email@domain.com < tmpd

else
     echo
     echo -e "\033[32mReplication is working fine"
     echo -e "\033[0m"

fi

Проблема в том, что сценарий работает только в том случае, если и главный, и подчиненный работают.Если мастер не работает, и я запускаю скрипт, он отображает сообщение об ошибке и отправляет электронное письмо.Если оба ведомых / ведомых работают, сценарий отображает «Репликация работает нормально», что нормально.Но когда я выключаю подчиненное устройство и запускаю скрипт, я получаю эту ошибку:

./monitor.bash: line 9: [: too many arguments

Replication is working fine

Я знаю, что проблема в том, что, поскольку я запрашиваю подчиненный сервер MySQL, он не находит его.Так что это не проверка условий Slave_IO_Running и Slave_SQL_Running.Как мне проверить, работает ли подчиненный сервер ДО запуска этих условий.Короче говоря, я хочу, чтобы «Репликация работала нормально» отображалась только в том случае, если ведущий и ведомый работают и работают, и это соответствует этим условиям.Любая помощь будет оценена.Спасибо.

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

Если $repl_IO и $repl_SQL не заполнены, то это:

if [ $repl_IO != "Yes" -o $repl_SQL != "Yes" ] ; then

эквивалентно этому:

if [ != Yes -o != Yes ] ; then

и я думаю, вы понимаете, почему это не работает. Вам нужно либо обернуть свои расширения параметров в двойные кавычки, чтобы они рассматривались как отдельные аргументы независимо от того, что они содержат:

if [ "$repl_IO" != "Yes" -o "$repl_SQL" != "Yes" ] ; then

или использовать [[...]] вместо [...], поскольку это немного умнее с такими вещами:

if [[ $repl_IO != "Yes" -o $repl_SQL != "Yes" ]] ; then

или оба:

if [[ "$repl_IO" != "Yes" -o "$repl_SQL" != "Yes" ]] ; then
1 голос
/ 02 марта 2012

Одна проблема с вашим скриптом: опытные программисты оболочки знают, что если переменная пуста, оператор

если [$ foo = что-то]

будет выглядеть как

если [= что-то]

Вы можете исправить это с помощью

if ["$ foo" = что-то]

Так что, в общем, ставьте "отметки вокруг всех переменных, используемых внутри []

0 голосов
/ 02 марта 2012

Или используйте [[ ]], если вы используете bash, кавычки переменных не нужны, и они более мощные, чем [ ].

greybot на IRC-канале freenode:

[[- ключевое слово bash, аналогичное (но более мощное) команде [.См. http://mywiki.wooledge.org/BashFAQ/031 и http://mywiki.wooledge.org/BashGuide/TestsAndConditionals. Если вы не пишете для POSIX sh, мы рекомендуем [[.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...