脚本未通过 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
而您的 $PWD
与 hana.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 运行。手动执行时工作正常的主要内容,如果未能解决你的问题,请参考以下文章