我有一堆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 ...
有什么建议吗?
此脚本适用于命令行。
答案 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
您有三种选择:
在已知的Perl系统路径中安装Plibdata.pm
(site_perl
是经典选项)。
使PERL5LIB shell环境(或Perl的等效命令行-I
选项)包含模块的安装路径。
在脚本中使用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
如果您使用的是ksh
或sh
,则可能需要说明
#!/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
作品