#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
и noecho "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