【问题标题】:No message on exit 1?出口 1 没有消息?
【发布时间】:2021-02-13 09:42:23
【问题描述】:
#!/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]#

【问题讨论】:

  • 您确定要查找的Connected 消息已写入标准输出吗?
  • 顺便说一句,if sqlplus -L "$DATABASE" <<<"exit" 2>&1 | grep -q Connected; then 可能是更简单的写法。而且我希望 sqlplus 将是一个表现良好的程序,如果它无法连接到数据库服务器,它会具有非零退出状态,尽管情况可能并非如此——我当我在 Oracle 商店时,我专门写回了我自己的数据库客户端,因为 sqlplus 在可脚本性方面考虑得非常糟糕。 (这已经是 15 年前的事了,所以我当然不记得导致该行动的具体投诉的细节)。
  • 顺便说一句,回复:set -e,见BashFAQ #105
  • 请注意,脚本将等待,直到 sqlplus 命令结束。或者换句话说,如果sqlplus 命令没有结束,你的脚本也不会结束。没有超时!
  • @Marco, ...因为它的标准输入将在读取 exit 后处于 EOF,但是,期望它退出是合理的。就此而言,我希望它仅以</dev/null 而不是echo "exit" | 退出。

标签: bash shell scripting sqlplus oracle19c


【解决方案1】:

因为你在脚本的开头有set -e。如果任何命令具有非零退出代码,这会使脚本立即退出。因此,当grep 失败时,脚本会立即退出,并且您永远不会在下一行测试$?

但也有例外:如果在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-24
    • 2017-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 2023-02-14
    • 1970-01-01
    相关资源
    最近更新 更多