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

时间:2009-04-15 20:52:49

标签: 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.

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

我也试图设置环境:

use lib "$ENV{CARSPATH}/install/lib";

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

我的cron命令将使用/usr/bin/sh执行crontabs ...

有什么建议吗?

此脚本适用于命令行。

6 个答案:

答案 0 :(得分:7)

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

试试这个:

perl -MPlibdata -e 1

假设没有吐出相同的错误,请尝试:

perl -MPlibdata -le 'print $INC{"Plibdata.pm"}'

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

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

答案 1 :(得分:6)

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

答案 2 :(得分: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

您有三种选择:

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

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

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

    my $env;
    
    BEGIN {
      $env = $ENV{CARSPATH};
    }
    
    use lib "$env/install/lib";
    

答案 3 :(得分:2)

cron在运行代码时没有为您设置环境,因此环境变量$CARSPATH不存在。我建议只从cron运行shell脚本,在shell脚本中设置环境,然后运行你真正想要运行的程序。

示例包装脚本:

#!/bin/bash

source ~username/.bash_profile
cd ~username
./script.pl

如果您使用的是kshsh,则可能需要说明

#!/bin/sh

. ~username/.profile
cd ~username
./script.pl

请记住将用户名替换为系统上的用户名。此外,如果脚本不在您的主目录中,您将需要使用其路径执行它,而不是./

您说source或句点空间,以在当前shell中加载给定的shell脚本。您可以在当前shell中加载它,以便任何环境设置都保留在当前shell中。

~/.bash_profile~/.bashrc~/.profile/etc/profile等都是通常用于保存环境的文件。您使用哪一个在很大程度上取决于您的操作系统以及设置它的人。

答案 4 :(得分:2)

正如其他人所建议的那样,从包装脚本运行程序可能是我的首选方法,但可能还有其他一些解决方案:

如果您使用的是现代cron,您可以在crontab条目中执行以下操作:

* * * * * CARSPATH=/opt/carsi x

用适当的时间表指示符替换星号。

这将为x进程设置CARSPATH,并允许使用传递环境变量的lib语句。

您还可以根据shell和cron实现将环境设置存储在文件中,并执行以下操作:

* * * * * source specialenv.sh && x

其中specialenv.sh包含类似(对于bash)的行

export CARSPATH=/opt/carsi

如果您选择这样做,您也可以直接在crontab中设置环境变量。

答案 5 :(得分:0)

虽然它不是'答案',但我通过使用DBI而不是Plibdata解决了这个问题。

哪种是乳白色的,因为现在我将不得不改变几个脚本...啊啊啊我希望我能做些什么来让Plibdata工作

我还是要去尝试Chas。欧文斯回答看看是否有效

<小时/> 对我来说不起作用......“翻译”/ bin / bash“没找到”可能会对那些有翻译的人有用

<小时/> <小时/>

* * * * * CARSPATH=/opt/carsi ./x

作品