【发布时间】: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 的作用很好,但它会将假脱机添加到我不确定的同一个文件中。如果我记得的话,我明天可以试试看会发生什么......