【问题标题】:Oracle SQLPlus spool command not working when script is scheduled with crontab?使用 crontab 计划脚本时 Oracle SQLPlus 假脱机命令不起作用?
【发布时间】:2017-03-07 17:49:00
【问题描述】:

我编写了一个如下所示的 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 在这种情况下不起作用?

【问题讨论】:

  • 可能在PATH 中找不到sqlplus。执行 cron 时检查 PATH 环境变量的值。通常,您的定义比手动登录要少得多。
  • 嗨@WernfriedDomscheit。我认为 sqlplus 在路径中找到。我可以在命令行上登录。我在linux环境中,像$sqlplus / as sysdba一样登录。
  • 但是,Cron 作业不会自动选择您登录时使用的相同环境。您需要进行设置;通过将 bash 配置文件作为 cron 命令的一部分或在脚本中运行,或者通过在脚本中显式设置变量(PATH、ORACLE_HOME 等)来运行。不要认为它是相关的,但是重定向输出和假脱机到同一个文件看起来像是一个错误。另外,我认为您会通过 cron 向 stderr 发送电子邮件 - 也许需要在某处进行配置,或者因为您的整个脚本成功退出而不会发生。
  • @Alex,我只建议将重定向作为诊断工作,而不是长期的事情。我同意这里的环境似乎是罪魁祸首,并且由于创建了一个空的日志文件,我的想法是 sqlplus 可能会生成一些错误消息。请记住,sqlplus 可以提供诊断输出并仍然向 shell 返回成功,在这种情况下,cron 没有理由认为它需要发送电子邮件。
  • 是的,我对 stdout 和 stderr 的作用很好,但它会将假脱机添加到我不确定的同一个文件中。如果我记得的话,我明天可以试试看会发生什么......

标签: oracle bash sqlplus spool


【解决方案1】:

您可能希望将 stderr 重定向到 stdout,或将其捕获到另一个文件中:

sqlplus / "as sysdba" <<EOF >$logfile 2>&1

如果 sqlplus 报告错误,您可能看不到它,因为您只是将标准输出捕获到日志文件。

【讨论】:

  • +1 为您的贡献。做你说的让我意识到找不到 sqlplus 命令。非常感谢。
【解决方案2】:

读完这里的cmets,我解决了这个问题。我想在脚本中显式设置变量。以下是工作版本:

#!/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 以使一切正常运行。

【讨论】:

  • 如果从你的 shell 运行脚本,你很可能只需要获取 .bashrc / .bash_profile 而不是明确声明这些。我想像这样对甲骨文之家进行硬编码会很痛苦/很容易被忽视。
  • 谢谢@bob。会尝试你的方法。
猜你喜欢
  • 2018-05-31
  • 2018-05-22
  • 1970-01-01
  • 2018-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-03
相关资源
最近更新 更多