脚本未通过 cron 运行。手动执行时工作正常

Posted

技术标签:

【中文标题】脚本未通过 cron 运行。手动执行时工作正常【英文标题】:script not running through cron. Works fine when executed manually 【发布时间】:2017-05-09 08:17:53 【问题描述】:

我有一个 shell 脚本,我从主脚本中调用 hana.scr 脚本。 hana.scr 包含以下代码。

chmod 777 /data/auto/SLT.out; rm -rf /data/auto/SLT.out; hdbsql -n plhesappr61 -i 00 -u USR -p $#^F#$GGG -o /data/auto/SLT.out "Select sum("ERPACC_RPPCLNT200"."VABD"."NETWR") FROM "ACC_CLNT"."VFKH" inner join "ACC_CLNT"."VNRO" on ("ACC_CLNT"."VNRO"."VBELN"="ACC_CLNT"."VFKH"."VBELN") where FKART in ('ZFP1','ZFP3') and FKDAT = (select ADD_DAYS (TO_DATE (current_date, 'YYYY-MM-DD'), -1) "add_days" from dummy) group by FKDAT";

当我手动运行主脚本时,它会很好地调用此脚本,并且还会生成 SLT.out 文件。 但是当我在 cron 中安排它时,主脚本执行得很好,除了这个 hana.scr 似乎没有执行,因为它甚至没有按照 hana.scr 中的第二个命令 rm 删除旧文件。

cron 与我手动运行脚本的用户是同一用户。 我读到如果 cron 没有运行相同的环境,就会发生这些问题。我也尝试在作为 hana.scr 执行之前导入用户的 UNIX 配置文件,但没有成功。

下面是运行从内部调用hana.scr的主脚本的cron命令:使用的绝对路径..

37 0,2,3,4,5,6 * * * /data/esb/auto/./main.sh R > /data/esb/auto/main.log

hana.scr 的执行方式如下:

./hana.scr;
check6=$? ;
                                if [ $check6 = "1" ]
                                        then
                                                echo "***********HANA counts were not generated**********"
                                fi

【问题讨论】:

将 cron 作业的错误也重定向到 main.log,看看会发生什么。 在“main.sh”中是否存在一些基于“hana.scr”启动的条件? “hana.scr”究竟是如何启动的?是否有任何原因导致“hana.scr”未执行,因为“main.sh”早于“hana.scr”启动失败? hana.scr 的启动方式如下:./hana.scr;检查6=$? ; if [ $check6 = "1" ] then echo "***********HANA counts were not generated**********" fi 可能是路径问题。尝试使用绝对路径名调用 hana.scr。请注意:为什么在删除文件之前 chmod 777 文件?要删除文件,您需要在其目录中写入权限,而不是文件本身。 改成绝对路径,还是什么都没有。美元?之后也返回 0(上面有完整的代码)。这表明它运行良好,但实际上它根本没有运行。如果它运行,它将创建一个新的 SLT.out 文件。对于 chmod,您的观点指出:) 【参考方案1】:

/data/esb/auto/./main.sh 之后,您的当前目录不会更改为/data/esb/auto/。我认为您从命令行开始 main.sh 而您的 $PWDhana.scr 的位置相同。 从命令行测试它

cd /
/data/esb/auto/main.sh

如何解决? 最糟糕的解决方案是将 crontab 行更改为

37 0,2,3,4,5,6 * * * cd /data/esb/auto; /data/esb/auto/main.sh R > /data/esb/auto/main.log

这是 crontab 的一种解决方法,但 main.sh 从不同目录启动时仍然失败。 调用 hana.scr 时使用 main.sh 中的完整路径会更好

myscriptdir=/data/esb/auto
..
$myscriptdir/hana.scr

当您更改文件夹时,您需要编辑文件并修复设置。 您可以尝试使用一些带有设置的配置文件或让 main.sh 找出它在哪个目录中:Getting the source directory of a Bash script from within

【讨论】:

以上是关于脚本未通过 cron 运行。手动执行时工作正常的主要内容,如果未能解决你的问题,请参考以下文章

cron 作业会杀死最后一个 cron 执行吗?

crontab不执行sh脚本 手动可以执行crontab执行失败【亲测】

脚本手动执行正常,放cron中执行有问题的原因

从命令行运行但不能通过 cron 运行时脚本运行良好

Ruby脚本在cron运行时抛出错误,但在用户运行时不会

仅在未运行时使用 cron 运行 python 脚本