두 시스템 간의 재해 복구 프로세스를 모니터링하고 스크립트가 로그 파일을 생성하는 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의 0행 뒤에 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
다음이 꼭 필요한 경우이메일변경하려면 $LOGFILE 자체 대신 메일 파이프라인에 추가하면 됩니다.
cat "$TEMPLOG" "$LOGFILE" | mailx -r ${DBOPS} -s "SUCCESS" ${EMAILTO}
답변2
귀하의 스크립트가 에 첨부되어 있으므로 $LOGFILE
귀하가 원하는 것은
mv $LOGFILE $TEMPLOG
처음에 그리고
cat $TEMPLOG >>$LOGFILE
메일 보내기 직전.