2013-06-16 6 views
0

Я написал скрипт perl test.pl, который использует подпрограмму, написанную в другом тестировании файлов .pm. Я могу запустить этот сценарий успешно вручную, но когда я запускаю тот же сценарий на кронтабе, я получаю следующее сообщение об ошибке
Can't locate testing.pm in @INC
Я изменил разрешение обоих файлов для выполнения разрешения и использовал "use testing" в верхней части скрипта. Как я могу успешно запустить скрипт на crontab.Как выполнить скрипт perl на 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="[email protected]" 
$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);  
} 

**

+1

Это подмножество вопроса на http://stackoverflow.com/questions/753670/why-cant-my-perl-script-load-a-module-when-run-by-cron?rq=1 – amon

+0

только одно предложение 'use strict;' – Ganesh

+0

@Ganesh use strict - Как это влияет на выполнение на crontab – Rudra

ответ

5

Вы должны сказать бинарным Perl, где искать testing.pm. Вы можете сделать это в кронтаб:

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

Или вы могли бы сделать это в вашем .pl сценария с помощью use lib:

#!/usr/bin/perl 
use strict; 
use warnings; 
use lib '/directory/where/testing.pm/lives'; 
... 

Update:

отредактированный вопрос показывает несколько проблем:

  1. Ваш crontab говорит PERL5LIB=$PERL5LIB:/home/test/testing.pm. Вам необходимо добавить каталог в PERL5LIB не путь к файлу. Правильной версией будет: `PERL5LIB = $ PERL5LIB:/home/test '.

  2. test.pl говорит use testing. Точка с запятой не найдена после testing.

+0

По-прежнему получаю ту же ошибку – Rudra

+0

Я получаю ту же ошибку – Rudra

+0

Тогда вернитесь к своему вопросу, отредактируйте вопрос и покажите нам какой-то код: Как выглядит ваш crontab? Как выглядит ваш 'test.pl'? – innaM

0

У вас есть testing.pm в вашем массиве @INC? Если нет, то вы можете add paths к @INC через переменные окружения PERL5LIB:

env PERL5LIB=/path/to/testing.pm perl test.pl 

Или использовать Lib модуль с другим путем - use lib qw#/path/to/testing.pm#; - в верхней части вашего сценария. Надеюсь, что вам нравится ...

1

Существует множество способов его крепления. Мое предпочтение было бы сохранить кронтаб простой и добавить что-то вроде:

use FindBin qw($Bin); 
use lib "$Bin/../lib"; 

Это предполагает, что файл библиотеки находится в фиксированном отношении к сценарию Perl. Пример исходит от documentation for the FindBin module.

Смежные вопросы