从cron.daily运行时,Perl无法找到模块

时间:2013-06-19 14:59:32

标签: perl cron perl-module

我有使用Net::Finger的perl程序,并在Fedora 11中从cron.daily成功运行。
我刚刚将服务器升级到Fedora 18,这些相同的perl程序不再从cron运行,但在以root身份登录时从命令行运行正常。
错误是:

Can't locate Net/Finger.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .)

模块的路径是/root/perl5/lib/perl5/Net/Finger.pm,但我无法弄清楚如何添加路径而不会导致更多错误。 提前谢谢。

2 个答案:

答案 0 :(得分:13)

请参阅perlfaq8

以下是将任意目录添加到Perl模块搜索路径的三种方法。

  1. 设置PERL5LIB环境变量

    15 15 * * 1-5 PERL5LIB=/root/perl5/lib/perl5 /usr/local/bin/perl my_script.pl
    
  2. 使用-I命令行开关

    15 15 * * 1-5 /usr/local/bin/perl -I/root/perl5/lib/perl5 my_script.pl
    
  3. 在perl脚本中使用lib pragma

    #! /usr/local/bin/perl
    # my_script.pl: the script that does my thing
    use lib '/root/perl5/lib/perl5';
    use Net::Finger;
    ...
    

  4. 另请注意,cron作业的环境比命令行的环境更稀疏,特别是cron环境的$PATH变量可能不是您所期望的。如果您没有指定Perl可执行文件的完整路径,请验证cron环境正在使用的$PATH,并确保您运行的是正确版本的perl。

答案 1 :(得分:1)

如果将其添加到脚本顶部会发生什么?

#!/usr/bin/perl
use lib "/root/perl5/lib/perl5/Net";

之前是否设置了.profile

这是来自ubuntu线程,但可能是相关的: https://askubuntu.com/questions/23009/reasons-why-crontab-does-not-work * Cron将一组最小的环境变量传递给您的工作。要查看差异,请添加如下虚拟作业:

* * * * * env > /tmp/env.output*

我目前还没有方便的linux盒子,但我会尝试通过运行以root身份登录并尝试设置作业以查看crontab具有的内容来查看@INC中的不同之处。上面的env输出可能表示crontab正在使用不同的shell,而不是以root用户身份登录时设置的。

以root身份登录并运行:

perl -le 'print for @INC'

设置一个cron作业来查看差异。我不确定这种语法是否有效,但您可以将命令放在一个简单的pl脚本中。

* * * * * perl -le 'print for @INC' > /tmp/inc.output

为env做同样的事情