Нет сообщения при выходе 1?

#bash #shell #scripting #sqlplus #oracle19c

#bash #оболочка #сценарии #sqlplus #oracle19c

Вопрос:

 #!/bin/sh
set -e
export DATABASE=U414_157_6300/U414_157_6300@db1230cn:1526/DBG192
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export JAVA_HOME=/u01/app/java/jdk180_231
export ORACLE_HOME=/u01/app/oracle/client19
export LD_LIBRARY_PATH=/u01/app/oracle/client19/lib
export PATH=$ORACLE_HOME/bin:$PATH
PATH=$PATH:$HOME/bin
export PATH

echo "exit" |sqlplus -L $DATABASE | grep 'Connected' > /dev/null
if [ $? -eq 0 ]
then
        echo "Database is up and the connection is successful!!"
        exit 0;
else
        echo "Database seems to be down!!"
        exit 1;
fi
  

Этот скрипт предназначен для проверки, работает ли база данных вверх или вниз. Когда я получаю следующий результат.

 ./db_status.sh
Database is up and the connection is successful!! 
  

Но когда DB не работает, я ничего не получаю!! почему??

 ./db_status.sh
[root@qaapp828cn u414_157_6300]#
  

Комментарии:

1. Вы уверены, Connected что искомое сообщение записано в стандартный вывод?

2. Кстати, if sqlplus -L "$DATABASE" <<<"exit" 2>amp;1 | grep -q Connected; then может быть, это более простой способ написать это. И я надеюсь , что sqlplus будет достаточно хорошо управляемой программой, чтобы иметь ненулевой статус выхода, если она не может подключиться к серверу базы данных, хотя это может быть и не так — я написал свой собственный клиент базы данных, когда был в магазине Oracle, специально потому, что sqlplus был настолько плохо -продумано с точки зрения скриптабельности. (Это примерно 15 лет назад, поэтому я, конечно, не помню подробностей конкретных жалоб, которые привели к этому действию).

3. кстати, re: set -e , см. BashFAQ # 105 .

4. Имейте в виду, что скрипт будет ждать, пока команда sqlplus не завершится. Или, другими словами, если sqlplus команда не завершается, ваш скрипт не завершится. Тайм-аута нет!

5. @Marco, … поскольку его стандартный идентификатор будет иметь значение EOF после его чтения exit , разумно ожидать, что он завершится. Я бы ожидал, что он завершится только с помощью a </dev/null и no echo "exit" | , если на то пошло.

Ответ №1:

Потому что у вас есть set -e в начале скрипта. Это приводит к немедленному завершению работы скрипта, если какая-либо команда имеет ненулевой код выхода. Поэтому при grep сбое скрипт завершается немедленно, и вы никогда не проводите тестирование $? на следующей строке.

Но есть исключения: если команда используется в качестве теста в an if , сценарий не завершается. Поэтому вместо тестирования $? просто протестируйте саму команду.

 if echo "exit" |sqlplus -L $DATABASE | grep -q 'Connected'
then
        echo "Database is up and the connection is successful!!"
        exit 0;
else
        echo "Database seems to be down!!"
        exit 1;
fi