如何在cron作业中运行特定的shell脚本?

时间:2015-04-30 17:35:07

标签: oracle csv cron crontab cron-task

我已经设置了一个cron作业,它将运行一个shell脚本来连接我们的Oracle数据库并将一个表复制为一个csv文件。

crontab -l outputs:

*/5 * * * * /home/user/import.sh > /home/user/importLog.txt

import.sh看起来像这样:

#!/bin/bash
FILE="/path/to/application/TABLE.csv"

sqlplus -s user/pw@db <<EOF

SET PAGESIZE 50000
SET COLSEP ","
SET LINESIZE 200
SET FEEDBACK OFF

SPOOL $FILE

SELECT * FROM TABLENAME;

SPOOL OFF
EXIT
EOF

现在,当我手动运行import.sh时,它成功导入表并创建csv文件,而cron作业似乎运行,因为它生成了importLog.txt(这是空白的),但它从未创建一个csv文件。

2 个答案:

答案 0 :(得分:3)

Cron的工作与非常贫穷的人一起工作#34;环境。您可能需要设置环境变量以找到tnsnames配置文件。您还期望sqlplus位于命令路径上,如果您之前未在crontab中设置它,则可能不会这样 - 我强烈建议您将完整路径放到sqlplus你脚本中的二进制文件最后,添加

MAILTO=your@email.addr

早期在您的crontab中确保您收到包含错误通知的电子邮件(假设您的sendmail配置设置正确)。

答案 1 :(得分:2)

除了将stderr重定向到您的日志文件

之外
MediaPlayer.create()

注意:如果您想要一个正在运行的日志(追加),那么:

import.sh > import.log 2>&1

您可能想要添加     每当sqlerror退出sql.sqlcode 在shell脚本中,以确保捕获错误:

import.sh >> import.log 2>&1

使用邮件和日志

如果要将stdout和stderr重定向到日志文件和邮件,可以在大多数* nix系统上执行此操作:

sqlplus -s user/password << EOF
whenever sqlerror exit sql.sqlcode;

...
EOF

这样,您既可以运行日志文件,也可以使用电子邮件警报(stderr和stdout)。如果需要,您还可以为crontab中的每个脚本设置不同的日志文件和/或电子邮件地址。