如何在crontab上执行perl脚本

时间:2013-06-16 13:44:50

标签: perl cron

我编写了一个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);    
}

**

3 个答案:

答案 0 :(得分:5)

您必须告诉您的Perl二进制文件在哪里查找testing.pm。您可以在crontab中执行此操作:

0 * * * * PERL5LIB=$PERL5LIB:/directory/where/testing.pm/lives perl myperlscript.pl

或者您可以使用use lib

在.pl脚本中执行此操作
#!/usr/bin/perl
use strict;
use warnings;
use lib '/directory/where/testing.pm/lives';
...

更新

您编辑的问题显示了几个问题:

  1. 您的crontab说PERL5LIB=$PERL5LIB:/home/test/testing.pm。您需要将目录添加到PERL5LIB而不是文件的路径。正确的版本是:`PERL5LIB = $ PERL5LIB:/ home / test'。

  2. 您的test.pluse 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#;。 希望对你进行分类......