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 접속을 못해서 발생한 문제
참조 :
'Linux, Unix > Tip' 카테고리의 다른 글
ls: cannot open directory .: Input/output error (0) | 2018.11.15 |
---|---|
crontab root 계정으로 일반유저 쉘 실행 (2) | 2018.11.13 |
vi 에서 치환 시 개행 문자(new-line character)(엔터) 입력 방법 (0) | 2018.11.09 |
리눅스 특정행만 출력, 특정행에서부터 출력, 특정 행 제외 출력 방법 (0) | 2018.11.08 |
리눅스6 새로넣은 디스크 mount 시키기 (0) | 2018.09.07 |