Perl脚本可以正常工作,但是无法通过CRON运行。

3

我有一个Perl脚本(用于将Delicious同步到WP),它:

  1. 可以通过shell运行,但是
  2. 无法通过cron运行(也没有报错)

我唯一能想到的是它错误地读取了配置文件...但是它是通过完整路径定义的(我认为是这样)。

我是这样读取我的配置文件的:

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

(我托管在mediatemple上)

有人有头绪吗?

更新1:完整代码在此处: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:完整路径解决了问题


1
它在cron和shell下运行的用户ID是否相同?在cron下可能会缺少路径或其他环境变量。将一些调试打印语句插入到您的脚本中以确定问题的所在。 - jira
我正在添加一些调试。 - edelwater
@dave-jennings:我正在使用:perl /home/12345/data/scripts/delicious/wpds.pl - edelwater
6个回答

7

从“环境”方面来看,cron作业和从shell运行的作业的区别在于:主要区别在于cron作业不会运行您的个人资料等内容,因此在cron环境中未设置与正常shell环境中设置的环境变量相同-没有路径扩展,没有标识Delicious和/或WP托管位置的环境变量等。

建议:创建一个cron作业,只需将环境报告到已知文件中:

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

然后比较一下您自己的shell环境中设置了什么。很有可能,这会揭示问题所在。

如果还是无法解决问题,其他环境差异包括cron作业没有终端,并且输入和输出使用/dev/null - 所以交互式内容不太适用。


@jonathan-leffler 谢谢,我会添加这个 cron 条目。 - edelwater
我想这可能就是它了,完整路径可能是/nfs/c00/h11/mnt/12345/data/scripts/delicious。我会等待24小时并回报 :) - edelwater
嗯...完整路径不起作用...这里需要进行更多的调试。 - edelwater

4
看起来问题不在于运行perl,而是定位Config库。
你可以尝试:
perl -e "print @INC"
并在cron中运行类似的perl脚本,并读取输出。它们可能存在差异。

你能换一种没有态度的说法吗? - Shizam

2

1
根据您的crontab和安装情况,问题可能是“perl”。正如其他人所指出的那样,cron的环境,特别是$PATH变量,与其他不同。perl可能不在路径中,因此您需要在cron命令中放置perl的完整路径。
您可以使用命令$ type perl确定路径。

@dave-jennings 不是 Perl 的问题,我已经在 cron 中运行这个 Perl 脚本约 5 年了,我所做的唯一更改是现在它读取一个配置文件。 - edelwater

0

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

Perl脚本可以运行,但是通过CRON不行 => 错误:"perl: command not found"

...在从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"

之后,我的定时任务都能正常运行,没有任何错误。

(Ubuntu 14.04 with Plesk 12.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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接