为什么我的Perl脚本在cron运行时无法加载模块?

Che*_*eso 3 perl cron

我有一堆Perl脚本都运行良好,但需要有use Plibdata;顶部.

我设置了一个运行的cron作业(我从root获取确认电子邮件)并且它回吐了以下错误消息:

Can't locate Plibdata.pm in @INC (@INC contains: /install/lib /opt/perl58/lib/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/5.8.8 /opt/perl58/lib/site_perl/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/site_perl/5.8.8 /opt/perl58/lib/site_perl .) at ./x line 5.

BEGIN failed--compilation aborted at ./x line 5.
Run Code Online (Sandbox Code Playgroud)

第5行是......你猜对了.... use Plibdata;

我也试图设置环境:

use lib "$ENV{CARSPATH}/install/lib";
Run Code Online (Sandbox Code Playgroud)

所以也许如果我找到了这个plibdata的位置,我可以明确指示它吗?

我的cron命令将使用/usr/bin/shcrontabs说来执行...

有什么建议?

此脚本从命令行运行.

Tan*_*lus 7

你没有说Plibdata是什么.您也没有说明这是否适用于您的命令提示符.我认为确实如此.

试试这个:

perl -MPlibdata -e 1
Run Code Online (Sandbox Code Playgroud)

假设没有吐出相同的错误,试试这个:

perl -MPlibdata -le 'print $INC{"Plibdata.pm"}'
Run Code Online (Sandbox Code Playgroud)

那会告诉你在哪里.(它可能在您的PERL5LIB env var中如果有效.)然后您可以将相应的"use lib"添加到Plibdata.pm所在的目录中.

另外,请确保在两个位置使用相同的perl - 命令行("per perl")和cron作业(在脚本顶部尝试"BEGIN {print $ ^ X}").


Zak*_*Zak 6

登录时,Cron使用与您的环境不同的用户环境.您是否能够从命令行运行脚本?如果是这样,只需将env变量设置在当前命令之上的cron中.


nxa*_*adm 5

显然,Plibdata.pm未安装在系统的默认模块路径中:

/install/lib /opt/perl58/lib/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/5.8.8 /opt/perl58/lib/site_perl/5.8.8/IA64.ARCHREV_0-thread-multi /opt/perl58/lib/site_perl/5.8.8 /opt/perl58/lib/site_perl
Run Code Online (Sandbox Code Playgroud)

你有三个选择:

  1. Plibdata.pm在已知的Perl系统路径中安装(site_perl是经典选项).

  2. 使PERL5LIB shell环境(或-IPerl 的等效命令行选项)包括模块的安装路径.

  3. use lib在脚本中使用.请记住,use lib操作是在编译时完成的,因此路径中的变量可能无法初始化.尝试在BEGIN块中使用变量,如下所示:

    my $env;
    
    BEGIN {
      $env = $ENV{CARSPATH};
    }
    
    use lib "$env/install/lib";
    
    Run Code Online (Sandbox Code Playgroud)