ログファイルの上部に追加

ログファイルの上部に追加

2つのシステム間の災害復旧プロセスを監視し、スクリプトがログファイルを生成するcrontabスクリプトがあります。私が要求したのは、デフォルトで作成された新しいログを下部ではなく古いログの上部(同じファイル名を使用しているため)に追加することです。

いくつかのオプションを見ましたが、すべての試みは失敗しました。

私は前に試しました

cat $LOGFILE >> $TEMPLOG
rm $LOGFILE
mv -i $TEMPLOG $LOGFILE

そしてまた

cat - $LOGFILE > $TEMPLOG && mv $TEMPLOG $LOGFILE

$ LOGFILE変数は、スクリプトがプロセスを関連付ける各ステートメントの場所です。

ありがとうございます:)

基本的に私が望むのは、メールで送信する前に最後の実行の上に正しいログを生成することです。

DATE=`date "+%d%m%y_%H%M"`
PRIMARY_HOSTNAME=`hostname`
LOGFILE=/dba/logs/monitor_sync_FM2.log
TEMPLOG=/dba/logs/monitor_sync_LOG.log
SERVER=`hostname`
SITE=mycompany
EMAILTO="[email protected]"
DBOPS="oracle@${SERVER}.${SITE}"

export PRIMARY_HOSTNAME LOGFILE TEMPLOG SERVER SITE EMAILTO DBOPS DATE
echo "\n\n### monitor DR sync  started @ `date` ###" >> $LOGFILE
echo "Running SQL command to verify latest SCN.." >> $LOGFILE
echo "The current SCN of the Primary DB server is: $PRIMARY_CURRENT_SCN" >> $LOGFILE

echo "Connecting now to the secondary standby database server..." >> $LOGFILE
SECONDARY_CURRENT_SCN=`ssh [email protected] /home/oracle/script_sync2.sh` >> $LOGFILE
export SECONDARY_CURRENT_SCN
echo "Secondary SCN output returned as: $SECONDARY_CURRENT_SCN" >> $LOGFILE
grep ORA- /dba/scripts/output.txt
if [ $? = 0 ]; then
echo "Remote ssh command to Secondary server failed..Exiting" >> $LOGFILE
echo "### monitor DR sync failed @ `date` ###" >> $LOGFILE
echo "PROBLEM" >> $LOGFILE

mailx -r ${DBOPS} -s "PROBLEM" ${EMAILTO} < $LOGFILE
exit
else
echo "The current SCN of the Secondary DB server is: $SECONDARY_CURRENT_SCN" >> $LOGFILE
DIFF=`expr $PRIMARY_CURRENT_SCN - $SECONDARY_CURRENT_SCN` ; export DIFF
if [ $PRIMARY_CURRENT_SCN -ne $SECONDARY_CURRENT_SCN ]; then
        echo "The difference is $DIFF" >> $LOGFILE
        if [ `echo $DIFF` -gt 3 ]; then
                echo "Log Gap: $DIFF" >> $LOGFILE
                                echo "PROBLEM" >> $LOGFILE
                                echo "### script finished @ `date` ###\n\n" >> $LOGFILE
                mailx -r ${DBOPS} -s "PROBLEM" ${EMAILTO}  < ${LOGFILE}
        else
                                echo "SUCCESS" >> $LOGFILE
                mailx -r ${DBOPS} -s "SUCCESS" ${EMAILTO}  < ${LOGFILE}
                echo "Log Gap: $DIFF" >> $LOGFILE
        fi
else
echo "Log Gap: $DIFF" >> $LOGFILE
echo "SUCCESS" >> $LOGFILE
mailx -r ${DBOPS} -s "SUCCESS" ${EMAILTO}  < ${LOGFILE}
fi
fi

ベストアンサー1

現在実行中のログを既存のログファイルの先頭に「追加」(挿入)するには、TEMPLOGファイルを使用してみてください。スクリプトのすべての出力/データを適切な$TEMPLOGファイルに書き込んでから、次のようにします。

ed -s $LOGFILE <<< "0r $TEMPLOG"$'\n'wq

$ LOGFILEのゼロ行の後にr$ TEMPLOGを作成します。

たとえば、

$ cat logfile
previous
entries
here
$ cat templog
New
Entry goes
Here
$ ed -s "$LOGFILE" <<< "0r $TEMPLOG"$'\n'wq
$ cat logfile
New
Entry goes
Here
previous
entries
here

シェルがhere-stringsをサポートしていない場合は、代わりにedのstdinに指示を印刷してください。

printf "0r $TEMPLOG\nwq\n" | ed -s logfile

次が必要な場合Eメール変更するには、$ LOGFILE自体の代わりにメールパイプラインに追加するだけです。

cat "$TEMPLOG" "$LOGFILE" | mailx -r ${DBOPS} -s "SUCCESS" ${EMAILTO}

おすすめ記事