7

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

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但我不知道如何添加路径而不会导致更多错误。提前致谢。

4

2 回答 2

16

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. lib在你的 perl 脚本中使用编译指示

    #! /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 可执行文件的完整路径,请验证$PATHcron 环境正在使用什么,并确保您运行的是正确版本的 perl。

于 2013-06-19T15:05:56.900 回答
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 身份登录时可能设置的 shell。

以 root 身份登录并运行:

perl -le 'print for @INC'

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

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

对 env 做同样的事情

于 2013-06-19T15:20:22.080 回答