프린트 하기

OS환경 : Oracle Linux6.8(64bit)


DB 환경 : Oracle Database 10.2.0.4


에러 : 크론탭 실행시 파일 크기 0

아래 스크립트를 sh report.sh 로 실행시키면 출력파일이 제대로 나오고 사이즈도 정상적이었는데

crontab 에 넣어서 실행시키면 계속 나오는 파일의 사이즈가 0이었다.(mon_report_${_DATE}.log의 사이즈)


$ crontab -l

###report#####

1 3 15 * * /home/oracle/exec/mon_report.sh

#############


제일 처음 스크립트

#script1 start

_DATE=`date '+%Y%m%d'`


sqlplus "kadmin/admin123" << EOF

spool mon_report.tmp

col user_id for a20

col file_name for a70

select * from kadmin.sort_report

where substr(REAL_TIME,1,6) = to_char(add_months(sysdate,-1), 'yyyymm')

order by 4;

spool off

EOF


sed -e '1,5d' mon_report.tmp | head -n -1 > mon_report_${_DATE}.log

rm mon_report.tmp

mv mon_report_${_DATE}.log /home/oracle/log/

#script1 end


script1 결과

sh 실행시 : 파일사이즈 정상

crontab 실행시 : 파일사이즈 0



그래서 구글링하니 경로 문제라고 해서 경로를 모두 절대경로로 바꾸어 주었다.

#script2 start

_DATE=`date '+%Y%m%d'`


sqlplus "kadmin/admin123" << EOF

spool /home/oracle/exec/mon_report.tmp

col user_id for a20

col file_name for a70

select * from kadmin.sort_report

where substr(REAL_TIME,1,6) = to_char(add_months(sysdate,-1), 'yyyymm')

order by 4;

spool off

EOF


sed -e '1,5d' /home/oracle/exec/mon_report.tmp | head -n -1 > /home/oracle/exec/mon_report_${_DATE}.log

rm /home/oracle/exec/mon_report.tmp

mv /home/oracle/exec/mon_report_${_DATE}.log /home/oracle/log/

#script2 end


script2 결과

sh 실행시 : 파일사이즈 정상

crontab 실행시 : 파일사이즈 0


결과는 그대로였고 경로를 변수로 써봐야겠다는 생각이 들어 변수로 바꾸어보았다.



#script3 start

_DATE=`date '+%Y%m%d'`

_EXEC_DIR=/home/oracle/exec/

_LOG_DIR=/home/oracle/log/


sqlplus "kadmin/admin123" << EOF

spool ${_EXEC_DIR}/mon_report.tmp

col user_id for a20

col file_name for a70

select * from kadmin.sort_report

where substr(REAL_TIME,1,6) = to_char(add_months(sysdate,-1), 'yyyymm')

order by 4;

spool off

EOF

sed -e '1,5d' ${_EXEC_DIR}/mon_report.tmp | head -n -1 > ${_EXEC_DIR}/mon_report_${_DATE}.log

rm ${_EXEC_DIR}/mon_report.tmp

mv ${_EXEC_DIR}/mon_report_${_DATE}.log ${_LOG_DIR}/

#script3 end


script3 결과

sh 실행시 : 파일사이즈 정상

crontab 실행시 : 파일사이즈 0


이것 또한 결과가 같았다.

뭐가 문제인지 파악하기 위해 rm ${_EXEC_DIR}/mon_report.tmp 구문도 제거해보고 테스트를 해보던중


sh 로 실행 할때는 sqlplus가 제대로 들어가지는데 

crontab 으로 하면 sqlplus가 제대로 안들어가져서 log가 안떨어지는걸 확인하였다.


=> 그래서 crontab도 sqlplus 를 접속할수 있게끔 스크립트 안에 .bash_profile을 적용시켜주었다.



#script4 start

_DATE=`date '+%Y%m%d'`

_EXEC_DIR=/home/oracle/exec/

_LOG_DIR=/home/oracle/log/

ORACLE_HOME=/app/oracle/product/10.2.0/db_1


. /app/oracle/.bash_profile



sqlplus "kadmin/admin123" << EOF

spool ${_EXEC_DIR}/mon_report.tmp

col user_id for a20

col file_name for a70

select * from kadmin.sort_report

where substr(REAL_TIME,1,6) = to_char(add_months(sysdate,-1), 'yyyymm')

order by 4;

spool off

EOF

sed -e '1,5d' ${_EXEC_DIR}/mon_report.tmp | head -n -1 > ${_EXEC_DIR}/mon_report_${_DATE}.log

rm ${_EXEC_DIR}/mon_report.tmp

mv ${_EXEC_DIR}/mon_report_${_DATE}.log ${_LOG_DIR}/

#script4 end


script4 결과

sh 실행시 : 파일사이즈 정상

crontab 실행시 : 파일사이즈 정상



해결 방법 : crontab에 경로를 잘적어주고 sqlplus 이용하는 shell일 경우 .bash_profile을 잘 적용시켜주자!




원인 : crontab에서 sqlplus 접속을 못해서 발생한 문제




참조 : 

https://kldp.org/node/118768 

https://kldp.org/node/38628