5

我有一个 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 作业的输出,这可能是来自 shell 的某种 perl “死”消息或“未找到”消息或其他什么?

还是我应该尝试以某种方式为命令的 cron 版本提供与它运行时相同的环境?

4

5 回答 5

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
于 2009-04-23T02:24:38.863 回答
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 或 DB2 应用程序的 ORACLE_HOME 或 DB2HOME 也可能是不错的选择)。然后,您可以在脚本或 crontab 中设置变量。

于 2009-04-23T02:26:14.147 回答
0

我会通过 cron 命令的绝对路径运行一个简单的 shell 脚本。在该脚本中,我将确保将 stdout 和 stderr 捕获到已知(或可知)文件中。我还要确保设置了足够的环境。在 Unix 上,当您通过 cron 运行命令时,您几乎没有设置任何环境 - 我不确定 MacOS X。问题的标准罪魁祸首是 PATH。我有一个单独.cronfile的设置我的工作环境,我通常没有问题 - 这是一个类似的.profile.

于 2009-04-23T02:26:21.823 回答
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 不同的环境变量运行。

于 2009-04-23T02:30:02.047 回答
-1

cron通常捕获 stdout 和 stderr 的输出并将任何输出通过电子邮件发送给 crontab 所有者。

您是否仔细检查了您的 crontab 条目以确保它有效并且将在正确的时间执行?

确保脚本不需要设置任何环境变量。否则将其包装在另一个 (bash) 脚本中,您可以在其中设置其他脚本期望的环境变量。

于 2009-04-23T02:24:22.857 回答