我有一个perl脚本(XMLTV系列“抓取器”的一部分,特别是tv_grab_oztivo
)。
我可以像这样成功运行它:
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml
我使用完整路径来消除工作目录中的问题。权限应该不是问题。
所以,如果我从终端(Mac OSX)运行它,它可以正常工作。
但是当我将它设置为通过cron作业运行时,似乎根本没有发生任何事情。没有创建输出等。
据我所知,crontab没有任何问题,因为如果我用helloworld.pl替换实际的脚本,它会在正确的时间运行。
那么,我该怎么做才能调试?我可以从两个案例中看%ENV
看到环境非常不同,但我可以采取哪些其他方法进行调试?如何查看cron作业的输出,这可能是某种perl“die”消息或shell中的“not found”消息或其他什么?
或者我应该尝试以某种方式将命令的cron版本设置为与我一样运行时的相同环境?
答案 0 :(得分:8)
经常因为在cron下运行时无法获得完整的环境。最好的办法是使用以下命令捕获输出:
( /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1
然后查看/tmp/qq
。
如果它确实是一个缺失的环境,那么你可能需要把:
. ~/.profile
或类似的东西,进入你的cron作业的执行链,例如:
( . ~/.profile ; /sw/bin/perl /path/to/tv_grab_oztivo ... ) >/tmp/qq 2>&1
答案 1 :(得分:3)
如果您在两种情况下查看%ENV,我建议,作为perl脚本的第一步,将%ENV设置为cron作业中的内容,然后尝试从命令行。你可能需要执行一次才能完全控制:
BEGIN {
if (exists $ENV{something_in_your_env_not_in_cron}) {
%ENV = (...);
exec $^X, $0, @ARGV;
}
}
现在尝试运行它,看看是否有任何你可以做的调试(包括在perl -d下运行,如果需要)。最有可能的是,你会发现你最终一次将一个项目添加回%ENV,直到它神奇地开始工作(LD_LIBRARY_PATH对此很好,但ORACLE_HOME或DB2HOME for Oracle或DB2应用程序也可能是一个不错的选择。 )。然后,您可以在脚本中设置变量,也可以在crontab中设置变量。
答案 2 :(得分:0)
我将通过cron命令的绝对路径运行一个简单的shell脚本。
在该脚本中,我确保将stdout和stderr捕获到已知(或可知)的文件中。我还要确保设置足够的环境。在Unix上,当你通过cron运行命令时几乎没有设置任何环境 - 我不确定MacOS X.问题的标准罪魁祸首是PATH。我有一个单独的.cronfile
设置我的工作环境足够我通常没有问题 - 这是.profile
的类似物。
答案 3 :(得分:0)
有时如果您无法弄清楚命令行出了什么问题,最简单的解决方法就是将整个内容转换为shell脚本。理想情况下,您不应该 来执行此操作,但它可能是解决问题的最快方法。
档案:/files/cron1.sh
#!/bin/sh
/sw/bin/perl /path/to/tv_grab_oztivo --output /path/to/tv.xml
然后在cron中:
/files/cron1.sh
这允许您独立于cron测试脚本。请记住,您的登录shell使用与cron不同的环境变量运行。
答案 4 :(得分:-1)
cron通常捕获stdout和stderr的输出,并通过电子邮件将任何输出发送给crontab所有者。
您是否仔细检查了crontab条目以确保其有效并将在合适的时间执行?
确保脚本不需要设置任何环境变量。否则将其包装在另一个(bash)脚本中,您可以在其中设置另一个脚本期望的环境变量。