我写了一个bash脚本,如下所示。当我在命令行上使用bash exec_proc_daily_20.sh
运行脚本时,该脚本可以正常工作。作为spool $logfile
命令的结果,内部记录成功创建了日志文件。
#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
prefixe=$month$day$year
logfile="/home/oracle/logs/exec_proc_daily_20_"$prefixe.log
sqlplus / "as sysdba" <<EOF >$logfile
spool on
spool $logfile
execute Proc_RFC_MAJ_MV_ITIN;
execute Proc_RFC_MAJ_MV_REFGEO;
commit;
quit
EOF
但是,当我使用crontab -e
安排脚本时,如下所示:
* 4 * * * bash /home/oracle/scripts/exec_proc_daily_20.sh
创建了日志文件,但没有写入任何内容。为什么spool $logfile
在这种情况下不起作用?
答案 0 :(得分:3)
您可能希望将stderr重定向到stdout,或者将其捕获到另一个文件中:
sqlplus / "as sysdba" <<EOF >$logfile 2>&1
如果sqlplus报告错误,您可能没有看到它,因为您只是将stdout捕获到日志文件中。
答案 1 :(得分:0)
在这里阅读评论后,我解决了这个问题。我想在脚本中显式设置变量。以下是工作版本:
#!/bin/bash
year=`date +%Y`
month=`date +%m`
day=`date +%d`
prefixe=$month$day$year
logfile="/home/oracle/logs/exec_proc_daily_20_"$prefixe.log
export ORACLE_HOME=/u01/app/oracle/product/12.1.0.2/dbhome_2
export ORACLE_SID=IMSPROD1
export ORACLE_BIN=${ORACLE_HOME}/bin
export PATH=$PATH:${ORACLE_BIN}
sqlplus / "as sysdba" <<EOF >$logfile
spool on
spool $logfile
execute Proc_RFC_MAJ_MV_ITIN;
execute Proc_RFC_MAJ_MV_REFGEO;
commit;
quit
EOF
从上面的代码中可以看出,我添加了ORACLE_HOME,ORACLE_SID,ORACLE_BIN和PATH以使工作正常。