我有点坚持下面的脚本,我想在成功完成命令时发出一条消息,但同时如果它不成功,那么它应该继续。
我们有 Oracle 服务器,下面的数据库是 3 节点 rac 服务器。我想要存档的是,当我关闭节点 1 上的实例(例如 TEST11)时,它不会显示成功完成命令的输出。否则,它会抛出一个错误,所以我想将该错误记录在一个文件中,并回显它是否成功或出错。
for DBI in TEST11 TEST21 TEST31 TEST41
do
DB=$(echo -n $DBI | head -c -1)
echo $DB
export ORACLE_SID=$DBI
export ORACLE_HOME=`grep "^${DBI}:" /etc/oratab | cut -d: -f2 -s`
$ORACLE_HOME/bin/srvctl stop instance -d $DB -i $DBI
done
谢谢穆罕默德DBA
答案1
在 bash 中,$?
您会得到上一个命令的返回码。如果上一个命令成功,则返回代码为零,否则为非零。
在下面的示例中,我在文件中搜索包含成功和失败情况的字符串。您可以在脚本中使用此逻辑。
我的脚本 test.sh 的内容
grep "grapes" file1 > /dev/null
if [ $? -eq 0 ]
then
echo "Success. Perform success action"
else
echo "Failure.. Do Failure action"
fi
以下是示例执行:
#cat file1
apple
grapes
#sh test.sh
Success. Perform success action
#cat file1
apple
#sh test1
Failure.. Do Failure action
答案2
假设 srvctl
向调用 shell 返回有用的退出状态,我们可以在if
脚本的语句中使用它来输出消息,具体取决于数据库是否成功关闭。
#!/bin/bash
export ORACLE_SID ORACLE_HOME
for ORACLE_SID in TEST{1..4}1
do
# The database name is the same as the SID,
# but with the last character removed.
db=${ORACLE_SID%?}
# Get the ORACLE_HOME directory by parsing /etc/oratab.
ORACLE_HOME=$( awk -F : '$1 == ENVIRON["ORACLE_SID"] { print $2 }' /etc/oratab )
# Try stopping the service.
if "$ORACLE_HOME"/bin/srvctl stop instance -db "$db" -instance "$ORACLE_SID"
then
# Report success.
printf 'DB "%s" on instance "%s" stopped\n' "$db" "$ORACLE_SID"
else
# Report failure, log to file.
printf 'Failed stopping DB "%s" on instance "%s"\n' "$db" "$ORACLE_SID" |
tee -a error.log >&2
fi
done
上面的脚本以可移植的方式重新实现了您自己的大部分脚本,删除了对外部实用程序的不必要的调用,不使用超出需要的变量,并添加了一条if
语句,该语句要么输出有关成功停止服务的消息,要么输出有关无法停止服务的消息。停止服务。如果服务未停止,相关消息将另外添加到error.log
当前目录中调用的日志文件中。
上述脚本的一个变体,避免在每次迭代中读取整个/etc/oratab
,而是解析循环中的文件,测试我们是否找到了有趣的ORACLE_SID
,否则跳到下一次迭代。该if
语句与第一个脚本相同。
#!/bin/bash
export ORACLE_SID ORACLE_HOME
while IFS=: read -r ORACLE_SID ORACLE_HOME
do
# Skip uninteresting SIDs.
[[ $ORACLE_SID != TEST[1-4]1 ]] && continue
db=${ORACLE_SID%?}
if "$ORACLE_HOME"/bin/srvctl stop instance -db "$db" -instance "$ORACLE_SID"
then
printf 'DB "%s" on instance "%s" stopped\n' "$db" "$ORACLE_SID"
else
printf 'Failed stopping DB "%s" on instance "%s"\n' "$db" "$ORACLE_SID" |
tee -a error.log >&2
fi
done </etc/oratab
[[ $ORACLE_SID != TEST[1-4]1 ]]
您可以通过将测试更改为从上面的脚本中删除所有“bash-isms”
case $ORACLE_SID in (TEST[1-4]1) : ;; (*) continue; esac