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}
答え2
あなたのスクリプトがに添付されているので、$LOGFILE
あなたが望むもの
mv $LOGFILE $TEMPLOG
最初にそして
cat $TEMPLOG >>$LOGFILE
メールを送信する直前。