以下のスクリプトにいくつかの問題があります。コマンドが正常に完了したらメッセージをエクスポートしたいが、同時に成功しない場合は続行する必要があります。
私たちは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では、$?
前のコマンドの戻りコードを取得します。前のコマンドが成功した場合、戻りコードは0になり、それ以外の場合は0ではありません。
次の例では、成功条件と失敗条件を含む文字列をファイルから取得します。スクリプトでこのロジックを使用できます。
私のスクリプト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
有用な終了状態が呼び出しシェルに返されると仮定すると、 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