Perl可以';从cron.daily运行时找不到模块

Perl可以';从cron.daily运行时找不到模块,perl,cron,perl-module,Perl,Cron,Perl Module,我有使用Net::Finger的perl程序,并且在Fedora 11中从cron.daily成功运行。 我刚刚将一台服务器升级到Fedora18,这些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 /u

我有使用
Net::Finger
的perl程序,并且在Fedora 11中从
cron.daily
成功运行。
我刚刚将一台服务器升级到Fedora18,这些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
,但我不知道如何添加路径而不会导致更多错误。 提前感谢。

请参阅

这里有三种向Perl的模块搜索路径添加任意目录的方法

  • 设置
    PERL5LIB
    环境变量

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

    15 15 * * 1-5 /usr/local/bin/perl -I/root/perl5/lib/perl5 my_script.pl
    
  • 在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;
    ...
    


  • 还要注意,cron作业的环境比命令行的环境要稀疏得多,尤其是cron环境的
    $PATH
    变量可能不是您所期望的。如果未指定Perl可执行文件的完整路径,请验证cron环境正在使用的
    $path
    ,并确保运行的是正确版本的Perl。

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

    #!/usr/bin/perl
    use lib "/root/perl5/lib/perl5/Net";
    
    这是以前在
    .profile
    中设置的吗

    这来自ubuntu线程,但可能与以下内容有关: *Cron向作业传递一组最小的环境变量。要查看差异,请添加如下虚拟作业:

    * * * * * env > /tmp/env.output*
    
    目前我手头没有linux设备,但我会尝试通过以root用户身份登录并尝试设置一个作业来查看crontab的功能,从而查看@INC的不同之处。上面的
    env
    输出可能表明crontab使用的shell与您作为root用户登录时设置的shell不同

    以root用户身份登录并运行:

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

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

    对env执行同样的操作

    这样一个奇怪的安装位置!它没有安装在预期目录中有什么原因吗?也有许可问题需要考虑。@ IKGAMI:一个地方:LIB安装根,也许?这就是为什么这很奇怪。我的意思是,这可能是意外考虑让root以外的其他用户运行该作业。你真的需要root的力量来完成这项工作吗?谢谢。这个程序也使用DBI。。。从cron中查找perl没有问题,因此它可能位于不同的位置。如果我使用带有路径的lib,它还能找到DBI吗?换句话说,它是将指定的库添加到现有环境中还是替换它?所有这些方法都会将(prepend,really)添加到搜索路径中。如果在
    /root/perl5/lib/perl5
    下有另一个名为
    DBI.pm
    的模块,然后perl将加载该文件而不是系统文件。这个问题/答案保存了我。perl-le“print for@INC”返回:
    /root/perl5/lib/perl5/x86\u 64-linux-thread-multi/root/perl5/lib/perl5/usr/local/lib64/perl5/usr/local/share/perl5/vendor\u perl/usr/share/lib64/perl5/usr/share/perl5
    cron作业在/tmpI中没有生成任何输出查看cron作业没有生成任何输出的原因。。。在cron日志中出现“坏用户名”错误。您想让我使用什么用户名?我尝试在crontab中输入root作为用户名,结果是:
    [root@sendmailtmp]#cat env.output MAILTO=root SHELL=/bin/bash USER=root PATH=/sbin:/bin:/usr/sbin:/usr/bin PWD=/root SHLVL=1 HOME=/root LOGNAME=root=/bin/env[root@sendmail[tmp]#cat inc.output/usr/local/lib64/perl5/usr/local/share/perl5/usr/lib64/perl5/vendor\u perl/usr/share/perl5/vendor\u perl/usr/lib64/perl5/usr/share/perl5