3

我有一堆 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/shcrontabs 执行...

有什么建议么?

该脚本从命令行工作。

4

6 回答 6

7

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

试试这个:

perl -MPlibdata -e 1

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

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

那会告诉你在哪里。(如果可行,它可能在您的 PERL5LIB 环境变量中。)然后您可以将适当的“使用库”添加到 Plibdata.pm 所在的目录中。

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

于 2009-04-15T20:58:00.800 回答
6

登录时,Cron 使用的用户 env 与您的 env 不同。您可以从命令行运行脚本吗?如果是这样,只需在当前命令上方的 cron 中设置环境变量。

于 2009-04-15T20:59:46.880 回答
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. 安装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";
    
于 2009-04-15T21:57:24.433 回答
2

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

示例包装脚本:

#!/bin/bash

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

如果您正在使用ksh,或者sh您可能需要说

#!/bin/sh

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

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

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

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

于 2009-04-15T21:52:06.690 回答
2

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

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

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

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

这将为 x 进程设置 CARSPATH 并允许传递环境变量的 use lib 语句工作。

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

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

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

export CARSPATH=/opt/carsi

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

于 2009-04-16T16:49:47.500 回答
0

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

这有点像乳白色,因为现在我将不得不更改几个脚本...

我还是要试试查。欧文斯回答看看是否有效


对我不起作用...“未找到解释器“/bin/bash””
也许它适用于拥有该解释器的人



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

作品

于 2009-04-16T15:59:02.100 回答