コマンドが正常に完了したら、どのように出力を提供できますか?

コマンドが正常に完了したら、どのように出力を提供できますか?

以下のスクリプトにいくつかの問題があります。コマンドが正常に完了したらメッセージをエクスポートしたいが、同時に成功しない場合は続行する必要があります。

私たちは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

関連情報