変数の出力に基づいてブロックを実行する[閉じる]

変数の出力に基づいてブロックを実行する[閉じる]

以下は、私が作成したSIDに基づいて動作するスクリプトです。

 ps -ef | grep pmon

SIDがgrepさ​​れると、SIDを渡してdbenv()必要なパラメータを設定し、エントリからDB_VERSIONも削除します/etc/oratab

バージョンによっては、スクリプトはバージョンが12または11の場合はブロックを実行し、バージョンが10または9の場合はブロックを実行する必要があります。

TRACE_FILE12または11にはs値の下に警告ログがあり、10または9には出力がないため、TRACE_FILE10と9はBDUMPs値に基づいて警告ログを消去する必要があります。

だから私は次のスクリプトドラフトを書いたがうまくいきましたが、DB_VERSIONのロジックを適用したスクリプトに重複する部分が多いと感じました。

このスクリプトを改善する方法のアイデア

#############################################################################################################################################################
#!/bin/bash
#############################################################################################################################################################

TODAY=`date +%Y-%m-%d`
DATE=`date +%Y%b%d`
YESTERDAY=`date -d '-1 day' +%b%Y`
YDAY=`date -d '-1 day' +%Y%b%d`
HOST=`hostname`
LOG_LOCATION="/home/oracle/utility_script/dba_maint/logs"

mkdir -p ${LOG_LOCATION}

LOG_FILE="${LOG_LOCATION}/oracle_files_cleanup_${DATE}.log"

rm ${LOG_FILE} 2>/dev/null

dbenv ()
{
        ORACLE_HOME=`cat /etc/oratab | grep ^$ORACLE_SID | cut -d":" -f2`; export ORACLE_HOME
        PATH=$ORACLE_HOME/bin:$PATH ; export PATH
        LD_LIBRARY_PATH=$ORACLE_HOME/lib ; export LD_LIBRARY_PATH
        DB_VERSION=`cat /etc/oratab | grep "^$ORACLE_SID" | cut -d":" -f2 | rev | cut -d"/" -f2| rev | cut -d"." -f1`; export DB_VERSION
}


dbcheck()
{
        sqlplus / as sysdba << EOF &>${LOG_LOCATION}/dbcheck.out
        exit
EOF
}

sql_plus()
{
        sqlplus -s / as sysdba << EOF &>/dev/null
        SET NEWPAGE NONE;
        set lines 200 pages 300;
        set feedback off;
        set heading off;
        spool ${LOG_LOCATION}/$1.log
        $2
        exit
EOF
}

for SID in `ps -eaf | grep pmon | grep -v grep | awk '{print $8}' | sort | cut -d"_" -f3`
do
        ORACLE_SID=${SID} ; export ORACLE_SID
        dbenv ${ORACLE_SID}                                                     #-- Passing the ORACLE_SID to dbenv function to source the database.
        if [ ${DB_VERSION} -eq 11 -o ${DB_VERSION} -eq 12 ]
        then
                dbcheck
                DB_CHECK=`cat ${LOG_LOCATION}/dbcheck.out | egrep "ORA|SP2|idle"`
                LOWER_SID=`echo ${ORACLE_SID} | tr '[A-Z]' '[a-z]'`

#-- Queries to fetch the proper log location from database

                ADUMP="select DISPLAY_VALUE from v\$parameter where name='audit_file_dest';"
                BDUMP="select DISPLAY_VALUE from v\$parameter where name='background_dump_dest';"
                CDUMP="select DISPLAY_VALUE from v\$parameter where name='core_dump_dest';"
                UDUMP="select DISPLAY_VALUE from v\$parameter where name='user_dump_dest';"
                TRACE_FILE="select DISPLAY_VALUE from v\$parameter where name='diagnostic_dest';"

#-- Calls the sql_plus function with the parameters as the logname and SQL query

                sql_plus "adump_${ORACLE_SID}" "${ADUMP}"
                sql_plus "bdump_${ORACLE_SID}" "${BDUMP}"
                sql_plus "cdump_${ORACLE_SID}" "${CDUMP}"
                sql_plus "udump_${ORACLE_SID}" "${UDUMP}"
                sql_plus "trace_${ORACLE_SID}" "${TRACE_FILE}"

#-- Remove any empty lines after the log location

                ADUMP_LOC=`cat ${LOG_LOCATION}/adump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`
                BDUMP_LOC=`cat ${LOG_LOCATION}/bdump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`
                CDUMP_LOC=`cat ${LOG_LOCATION}/cdump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`
                UDUMP_LOC=`cat ${LOG_LOCATION}/udump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`
                TRACE_LOC=`cat ${LOG_LOCATION}/trace_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`

#-- If the Database is not in idle state or without any errors, start housekeeping

                if [ -z "${DB_CHECK}" ]
                then
                        echo -e "\t\t\t\t HOUSEKEEPING for database : ${ORACLE_SID}" >>${LOG_FILE}
                        echo -e "\t\t\t\t ============ === ======== = =============" >>${LOG_FILE}

#-- Cleans .aud files older than 60 days in ADUMP location

                        if [ ! -z "${ADUMP_LOC}" ]
                        then
                                        echo -e "\t\t\tAdump cleanup" >> ${LOG_FILE}
                        fi

#-- Cleans .trm or .trc files older than 60 days in BDUMP location

                        if [ ! -z "${BDUMP_LOC}" ]
                        then
                                        echo -e "\n\n\t\t\tBdump cleanup" >> ${LOG_FILE}
                        fi

#-- Cleans .trm or .trc files older than 60 days in CDUMP location

                        if [ ! -z "${CDUMP_LOC}" ]
                        then
                                        echo -e "\n\t\t\tCdump cleanup" >> ${LOG_FILE}
                        fi

#-- Cleans .trm or .trc files older than 60 days in UDUMP location

                        if [ ! -z "${UDUMP_LOC}" ]
                        then
                                        echo -e "\n\t\t\tUdump cleanup" >> ${LOG_FILE}
                        fi

#-- Rotates the Database alert log on 01st of every month.

                        if [ `date +%d` -eq 01 ]
                        then
                                if [ ! -z "${TRACE_LOC}" ]
                                then
                                        echo -e "\n\t\t\tALERT LOG ROTATION" >> ${LOG_FILE}
                                fi
                        fi

#-- Rotates the Listener log on 01st of every month.

                        if [ `date +%d` -eq 01 ]
                                        if [ ! -z "${TRACE_LOC}" ]
                                        then
                                                        echo -e "\n\t\t\tLISTENER LOG ROTATION" >> ${LOG_FILE}
                                        fi
                        fi
                else
                        echo -e "ERROR : Please fix the below error in database - ${ORACLE_SID} on host - ${HOST} \n ${DB_CHECK}" >> ${LOG_LOCATION}/house_keeping_fail_${ORACLE_SID}_${DATE}.log
                fi
        elif [ ${DB_VERSION} -eq 10 -o ${DB_VERSION} -eq 9 ]
        then
                dbcheck
                DB_CHECK=`cat ${LOG_LOCATION}/dbcheck.out | egrep "ORA|SP2|idle"`

#-- Queries to fetch the proper log location from database

                ADUMP="select DISPLAY_VALUE from v\$parameter where name='audit_file_dest';"
                BDUMP="select DISPLAY_VALUE from v\$parameter where name='background_dump_dest';"
                CDUMP="select DISPLAY_VALUE from v\$parameter where name='core_dump_dest';"
                UDUMP="select DISPLAY_VALUE from v\$parameter where name='user_dump_dest';"

#-- Calls the sql_plus function with the parameters as the logname and SQL query

                sql_plus "adump_${ORACLE_SID}" "${ADUMP}"
                sql_plus "bdump_${ORACLE_SID}" "${BDUMP}"
                sql_plus "cdump_${ORACLE_SID}" "${CDUMP}"
                sql_plus "udump_${ORACLE_SID}" "${UDUMP}"

#-- Remove any empty lines after the log location

                ADUMP_LOC=`cat ${LOG_LOCATION}/adump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`
                BDUMP_LOC=`cat ${LOG_LOCATION}/bdump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`
                CDUMP_LOC=`cat ${LOG_LOCATION}/cdump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`
                UDUMP_LOC=`cat ${LOG_LOCATION}/udump_${ORACLE_SID}.log | sed 's/[[:blank:]]*$//'`

#-- If the Database is not in idle state or without any errors, start housekeeping

                if [ -z "${DB_CHECK}" ]
                then
#-- Cleans .aud files older than 60 days in ADUMP location

                        if [ ! -z "${ADUMP_LOC}" ]
                                        echo -e "\t\t\tAdump cleanup" >> ${LOG_FILE}
                        fi

#-- Cleans .trm or .trc files older than 60 days in BDUMP location

                        if [ ! -z "${BDUMP_LOC}" ]
                        then
                                        echo -e "\n\n\t\t\tBdump cleanup" >> ${LOG_FILE}
                        fi

#-- Cleans .trm or .trc files older than 60 days in CDUMP location

                        if [ ! -z "${CDUMP_LOC}" ]
                        then
                                        echo -e "\n\t\t\tCdump cleanup" >> ${LOG_FILE}
                        fi

#-- Cleans .trm or .trc files older than 60 days in UDUMP location

                        if [ ! -z "${UDUMP_LOC}" ]
                        then
                                        echo -e "\n\t\t\tUdump cleanup" >> ${LOG_FILE}
                        fi

#-- Rotates the ${DB_VERSION} version Database alert log on 01st of every month.

                        if [ `date +%d` -eq 01 ]
                        then
                                if [ ! -z "${BDUMP_LOC}" ]
                                then
                                        echo -e "\n\t\t\tALERT LOG ROTATION" >> ${LOG_FILE}
                                fi
                        fi
               else
                       echo -e "ERROR : Please fix the below error in database - ${ORACLE_SID} on host - ${HOST} \n ${DB_CHECK}" >> ${LOG_LOCATION}/house_keeping_fail_${ORACLE_SID}_${DATE}.log
               fi
        fi
done
exit $?
#---------------------------------------------------------------------END-----------------------------------------------------------------------------------#

ベストアンサー1

この質問は次のとおりです。 https://codereview.stackexchange.com/ここにはありませんが、私の提案は次のとおりです。

  1. $()コマンドの置き換えにバックティックの代わりに使用します。

  2. (ほぼ)入力grepawk

    ps -eaf | grep pmon | grep -v grep | awk '{print $8}'
    

    あなたはできます:

    ps -eaf | awk '/pmon/ && ! /grep/ {print $8}'
    

    繰り返しますが、通常配管を使用するのが最善ですgrep。たとえば、次のようになります。cutawk

    cat /etc/oratab | grep ^$ORACLE_SID | cut -d":" -f2
    

    使用

    awk -F: "/^$ORACLE_SID/ {print \$2}" /etc/oratab
    

    (通常、スクリプト全体を一重引用符で囲むのがより一般的であるため、スクリプトではエスケープしません$。この場合、bash変数を使用できるようにスクリプトを二重引用符で囲むので、バックスラッシュエスケープが必要です。シェルが独自のシェルに置き換えられないようにするするため)$2awkawkawk$ORACLE_SIDawkawk$2$2

  3. ps配管grepなどをする必要はありませんawk。あなたもこれを行うことができますps h -o cmd -C pmon。またはpgrep

  4. sed。他のすべての標準テキスト処理ツールcatに接続せずにファイル自体を読み取ることができますsedgrepawkperlcut

  5. [ -n "$var" ]同じです[ ! -z "$var" ]

    -z空の文字列をテストし、-n空でない文字列をテストします。

  6. 場合によっては、変数を二重引用符で囲んでいません。変数を使用するときは、(ほぼ)常に二重引用符で囲む必要があります。

  7. 固定リテラル文字列には一重引用符が使用されます。二重引用符は、文字列に変数またはコマンド置換を挿入したい場合に使用されます。

  8. インデントが8文字多すぎます。インデントレベルごとに2〜4個のスペースを使用します。または、エディタでタブストップを2〜4つのスペースに設定します。

  9. 独自の変数に小文字または大文字と小文字の混合を使用し、標準ユーティリティと汎用プログラム用にすべての大文字変数名を予約することをお勧めします。

  10. sqlplus, Letter" ソースmysqlなどのツールです。psql入力データを検証して削除しないと、スクリプトが破損しやすくなります。SQLインジェクションエラーを生成することも同様に簡単です。

    マイナーなSQLクエリでは、SQLコマンドで変数を参照するときに発生する問題を回避するために、プレースホルダをサポートするデータベースライブラリを含む他の言語をperl学ぶ必要があります。python

おすすめ記事