Perl脚本可以工作但不能通过CRON

时间:2010-12-03 00:08:04

标签: perl cron

我有一个perl脚本(与wp同步美味):

  1. 通过shell运行,但
  2. 不通过cron运行(我没有收到错误)
  3. 我唯一能想到的是它错误地读取了配置文件但是...它是通过完整路径定义的(我认为)。

    我将配置文件读作:

    my $config = Config::Simple->import_from('/home/12345/data/scripts/delicious/wpds.ini',
       \my %config);
    

    (我在mediatemple上托管)

    有人有线索吗?

    更新1 :HERE是完整代码:http://plugins.svn.wordpress.org/wordpress-23-compatible-wordpress-delicious-daily-synchronization-script/trunk/(但我已将上述路径添加到配置文件位置作为差异)

    更新2 :在https://forums.mediatemple.net/viewtopic.php?pid=31563#p31563

    上交叉发布

    更新3 :完整路径完成了解决,解决了

6 个答案:

答案 0 :(得分:7)

cron作业和从shell运行的作业之间的区别是“环境”。主要区别在于您的配置文件等不是针对cron作业运行的,因此您在普通shell环境中设置的任何环境变量在cron环境中都没有设置相同 - 没有对PATH的扩展,没有环境变量标识美味和/或WP是托管等。

建议:创建一个仅将环境报告给已知文件的cron作业:

env > /home/27632/tmp/env.27632

然后查看您自己的shell环境中设置的内容。机会是,这将揭示麻烦。

如果不这样做,其他环境差异就是cron作业没有终端,并且输入和输出都有/ dev / null - 所以交互式的东西不能正常工作。

答案 1 :(得分:4)

似乎问题不在于运行perl,而是找到Config库

你应该尝试:

  

perl -e“print @INC”

在cron中运行类似的perl脚本,并读取输出

它们可能不同

答案 2 :(得分:2)

我建议查看我对How to simulate the environment cron executes a script with?

的回答

这是类似乔纳森的答案,但更进一步。

答案 3 :(得分:1)

根据您的crontab,根据您的安装,问题可能是“perl”。正如其他人所指出的那样,环境,特别是$PATH变量,对于cron来说是不同的。 perl可能不在路径中,因此您需要在cron命令中将完整路径放入perl。

您可以使用命令$ type perl

确定路径

答案 4 :(得分:0)

我遇到了同样的问题......

Perl脚本有效但不能通过CRON =>错误:" perl:找不到命令"

...从Plesk 12.0更新到Plesk 12.5之后。但现有的答案对我没有多大帮助。

花了一些时间,但我在Odin论坛找到了这个帖子,它帮助了我:https://talk.plesk.com/threads/scheduled-tasks-always-fail.331821/

他们建议如下:

/usr/local/psa/bin/server_pref -u -crontab-secure-shell ""

在/ var / spool / cron / crontabs文件中删除行:

SHELL="/opt/psa/bin/chrootsh"

之后,我的cron作业没有任何错误。

(Ubuntu 14.04 with Plesk 12.5)

答案 5 :(得分:-1)

 If the perl script runs fine manually, but not from crontab, then
 there is some environment path needed by the some package that is not
 getting through `cron`. Run your command as follows:
 suppose your cron entry like:

* 13 * * * /usr/bin/perl /home/username/public_html/cron.pl >/dev/null 2>&1

 env - /home/username/public_html/cron.pl

 The output will show you the missing package. export that package path in
 $PATH variables