当使用 crontab 计划脚本时,Oracle SQLPlus 假脱机命令不起作用?
Oracle SQLPlus spool command not working when script is scheduled with crontab?
我写了一个 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
在这种情况下不起作用?
您可能希望将 stderr 重定向到 stdout,或将其捕获到另一个文件中:
sqlplus / "as sysdba" <<EOF >$logfile 2>&1
如果 sqlplus 报告错误,您可能看不到它,因为您只是将标准输出捕获到日志文件。
看了这里的评论,问题解决了。我应该在脚本中明确设置变量。以下是工作版本:
#!/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 以使一切正常。
我写了一个 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
在这种情况下不起作用?
您可能希望将 stderr 重定向到 stdout,或将其捕获到另一个文件中:
sqlplus / "as sysdba" <<EOF >$logfile 2>&1
如果 sqlplus 报告错误,您可能看不到它,因为您只是将标准输出捕获到日志文件。
看了这里的评论,问题解决了。我应该在脚本中明确设置变量。以下是工作版本:
#!/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 以使一切正常。