我编写了一个perl脚本test.pl,它使用另一个文件测试.pm编写的子程序。我能够手动成功运行此脚本,但是当我在crontab上运行相同的脚本时,我收到以下错误
的 Can't locate testing.pm in @INC
我已将这两个文件的权限更改为执行权限,并在脚本顶部使用了 "use testing"
。如何在crontab上成功运行脚本。
Crontab : */2 * * * * PERL5LIB=$PERL5LIB:/home/test/testing.pm /home/test/test.pl > /home/test/test.log 2>&1
**
test.pl
#!/usr/bin/perl -w
use DBI;
use warnings;
use Time::Piece;
use HTML::Entities;
use lib '/home/test';
use testing
# Connecting to the database #
my $dbh = DBI->connect("DBI:mysql:database=test;host=localhost;mysql_socket=/var/run/mysqld/mysqld.sock","root","password", {'RaiseError' => 1});
# my $dob = '2009-04-21 00:00:00';
my $dob = '2009-04-22 00:00:00';
#my $dob = localtime->strftime('%Y-%m-%d %H:%M:%S');
print "\ndob : $dob\n";
$name="test";
$number=1;
$email="test@test.com"
$id="123";
if ($mail==0)
{
send_msg(0,$name,$number,$email,$aid);
}
if ($sms==0)
{
send_msg(1,$name,$number,$email,$id);
}
}
sub send_msg {
my ($type,$name,$number,$email,$id) = @_;
$sql7 = "select Sms,email from settings where Id='$id'";
$sth7 = $dbh->prepare($sql7);
$sth7->execute
or die "SQL Error: $DBI::errstr\n";
my ($sms,$email)=$sth7->fetchrow_array();
my $xml=testing::xml($type,$name,$number,$email,$sms,$email);
}
**
答案 0 :(得分:5)
您必须告诉您的Perl二进制文件在哪里查找testing.pm
。您可以在crontab中执行此操作:
0 * * * * PERL5LIB=$PERL5LIB:/directory/where/testing.pm/lives perl myperlscript.pl
或者您可以使用use lib
:
#!/usr/bin/perl
use strict;
use warnings;
use lib '/directory/where/testing.pm/lives';
...
更新
您编辑的问题显示了几个问题:
您的crontab说PERL5LIB=$PERL5LIB:/home/test/testing.pm
。您需要将目录添加到PERL5LIB
而不是文件的路径。正确的版本是:`PERL5LIB = $ PERL5LIB:/ home / test'。
您的test.pl
说use testing
。在testing
之后的任何地方都找不到分号。
答案 1 :(得分:1)
有多种方法可以解决这个问题。我的偏好是保持crontab简单并添加如下内容:
use FindBin qw($Bin);
use lib "$Bin/../lib";
这假定库文件与perl脚本具有固定关系。该示例来自documentation for the FindBin
module。
答案 2 :(得分:0)
你的@INC数组中有testing.pm
吗?如果没有,您可以通过PERL5LIB环境变量add paths到@INC:
env PERL5LIB=/path/to/testing.pm perl test.pl
或者在脚本的顶部使用具有不同路径的lib模块 - use lib qw#/path/to/testing.pm#;
。
希望对你进行分类......