为什么我的命令行不能从cron运行?

时间:2009-04-23 02:18:32

标签: perl shell cron environment-variables

我有一个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版本设置为与我一样运行时的相同环境?

5 个答案:

答案 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)脚本中,您可以在其中设置另一个脚本期望的环境变量。